Compare commits

..

No commits in common. "master" and "v4.2.0.0.dev1" have entirely different histories.

191 changed files with 38399 additions and 55115 deletions

View file

@ -1,157 +0,0 @@
# download at https://api.cirrus-ci.com/v1/artifact/github/electronstudio/raylib-python-cffi/pi/binary.zip
# https://api.cirrus-ci.com/v1/artifact/github/electronstudio/raylib-python-cffi/mac/binary.zip
pi_task:
arm_container:
matrix:
- image: dtcooper/raspberrypi-os:python3.12-bullseye
- image: dtcooper/raspberrypi-os:python3.11-bullseye
- image: dtcooper/raspberrypi-os:python3.10-bullseye
- image: dtcooper/raspberrypi-os:python3.9-bullseye
env:
matrix:
- RAYLIB_PLATFORM: "Desktop"
RAYLIB_OPENGL: "2.1"
- RAYLIB_PLATFORM: "SDL"
RAYLIB_OPENGL: "2.1"
- RAYLIB_PLATFORM: "DRM"
RAYLIB_OPENGL: "ES 2.0"
setup_script:
- apt update
- apt -y install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev libwayland-dev libxkbcommon-dev libgbm-dev libdrm-dev
build_sdl_script:
- wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
- tar xvfz release-2.30.7.tar.gz
- mkdir buildsdl
- cd buildsdl
- cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
- cmake --build . --config Release
- cmake --install .
- cd ..
build_raylib_script:
- git submodule update --init --recursive
- cd raylib-c
- mkdir build
- cd build
- cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
- make -j2
- make install
build_raylib_again_script:
- cd raylib-c
- mkdir build2
- cd build2
- cmake -DPLATFORM=${RAYLIB_PLATFORM} -DOPENGL_VERSION="${RAYLIB_OPENGL}" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
- make -j2
- cp raylib/libraylib.a /usr/local/lib/libraylib.a
build_script:
- cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
- cp physac/src/physac.h /usr/local/include/
- cp raygui/src/raygui.h /usr/local/include/
- python -m pip install --break-system-packages --upgrade pip
- python -m pip install --break-system-packages cffi
- python -m pip install --break-system-packages setuptools
- python -m pip install --break-system-packages wheel
- python setup.py bdist_wheel --plat-name manylinux2014_aarch64
test_script:
- python -m pip install --break-system-packages dist/*.whl
- cd /
- python -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
- cat /tmp/output
- if grep -q "INFO: Initializing raylib" /tmp/output; then
- echo "Passed"
- exit 0
- else
- echo "Failed"
- exit 1
- fi
artifacts:
path: "dist/*"
mac_task:
macos_instance:
matrix:
- image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
env:
MACOSX_DEPLOYMENT_TARGET: "11.0"
matrix:
- env:
PY_VER: "3.9"
RAYLIB_PLATFORM: Desktop
- env:
PY_VER: "3.9"
RAYLIB_PLATFORM: SDL
- env:
PY_VER: "3.10"
RAYLIB_PLATFORM: Desktop
- env:
PY_VER: "3.10"
RAYLIB_PLATFORM: SDL
- env:
PY_VER: "3.11"
RAYLIB_PLATFORM: Desktop
- env:
PY_VER: "3.11"
RAYLIB_PLATFORM: SDL
- env:
PY_VER: "3.12"
RAYLIB_PLATFORM: Desktop
- env:
PY_VER: "3.12"
RAYLIB_PLATFORM: SDL
- env:
PY_VER: "3.13"
RAYLIB_PLATFORM: Desktop
- env:
PY_VER: "3.13"
RAYLIB_PLATFORM: SDL
setup_script:
- brew update
- brew install python@${PY_VER}
build_sdl_script:
- wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
- tar xvfz release-2.30.7.tar.gz
- mkdir buildsdl
- cd buildsdl
- cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
- cmake --build . --config Release
- sudo cmake --install .
- cd ..
build_raylib_script:
- git submodule update --init --recursive
- cd raylib-c
- mkdir build
- cd build
- cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
- make -j8
- sudo make install
build_raylib_again_script:
- cd raylib-c
- mkdir build2
- cd build2
- cmake -DPLATFORM=${RAYLIB_PLATFORM} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
- make -j8
- sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
build_script:
- sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
- sudo cp physac/src/physac.h /usr/local/include/
- sudo cp raygui/src/raygui.h /usr/local/include/
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages cffi
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages setuptools
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages wheel
- /opt/homebrew/bin/python${PY_VER} setup.py bdist_wheel
test_script:
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages dist/*.whl
- cd /
- /opt/homebrew/bin/python${PY_VER} -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
- cat /tmp/output
- if grep -q "INFO: Initializing raylib" /tmp/output; then
- echo "Passed"
- exit 0
- else
- echo "Failed"
- exit 1
- fi
artifacts:
path: "dist/*"

View file

@ -4,266 +4,151 @@ name: Build
on: on:
# Triggers the workflow on push or pull request events but only for the master branch # Triggers the workflow on push or pull request events but only for the master branch
push: push:
branches: [ master ]
pull_request: pull_request:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build-mac-intel: build-mac:
runs-on: macos-13 runs-on: macos-10.15
strategy: strategy:
matrix: matrix:
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ] python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11.0-alpha - 3.11.0', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9' ]
raylib-platform: ['Desktop', 'SDL']
env:
MACOSX_DEPLOYMENT_TARGET: '10.13'
steps: steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4 - uses: actions/checkout@v2
with: with:
submodules: recursive submodules: recursive
- name: Build SDL
run: |
wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
tar xvfz release-2.30.7.tar.gz
mkdir build
cd build
cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
sudo cmake --install .
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v2.2.2
with: with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax. # Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
# The target architecture (x86, x64) of the Python interpreter. # The target architecture (x86, x64) of the Python interpreter.
architecture: x64 architecture: x64
# Runs a set of commands using the runners shell
- name: Build raylib without SDL because SDL version has incorrect pkg-config
run: |
cd raylib-c
mkdir build
cd build
cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo make install
- name: Build raylib with SDL if selected
run: |
cd raylib-c
mkdir build2
cd build2
cmake -DPLATFORM=${{ matrix.raylib-platform }} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
- name: Copy extras
run: |
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
sudo cp physac/src/physac.h /usr/local/include/
sudo cp raygui/src/raygui.h /usr/local/include/
- name: Build raylib-python-cffi
env:
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
run: |
python -m pip install --upgrade pip
pip3 install "cffi>=1.17.1"
pip3 install wheel
pip3 install setuptools
python setup.py bdist_wheel --plat-name macosx_10_13_x86_64
- name: Test
run: |
pip3 install dist/*.whl
cd /
python3 -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
cat /tmp/output
if grep -q "INFO: Initializing raylib" /tmp/output; then
echo "Passed"
exit 0
else
echo "Failed"
exit 1
fi
- name: Upload build Artifact wheel
uses: actions/upload-artifact@v4
with:
name: wheel-mac-${{ matrix.raylib-platform }}-${{ matrix.python-version }}
path: dist/*
# build-mac-universal:
# runs-on: macos-14
# strategy:
# matrix:
# python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
# raylib-platform: ['Desktop', 'SDL']
# env:
# MACOSX_DEPLOYMENT_TARGET: 11.0
# steps:
# # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
# - uses: actions/checkout@v4
# with:
# submodules: recursive
#
# - name: Build SDL
# run: |
# wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
# tar xvfz release-2.30.7.tar.gz
# mkdir build
# cd build
# cmake ../SDL-release-2.30.7 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
# cmake --build . --config Release
# sudo cmake --install .
#
# - name: Setup Python
# uses: actions/setup-python@v5
# with:
# # Version range or exact version of a Python version to use, using SemVer's version range syntax.
# python-version: ${{ matrix.python-version }}
# architecture: arm64
#
# # Runs a set of commands using the runners shell
# - name: Build raylib without SDL because SDL version has incorrect pkg-config
# run: |
# cd raylib-c
# mkdir build
# cd build
# cmake -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
# make -j2
# sudo make install
#
# - name: Build raylib with SDL if selected
# run: |
# cd raylib-c
# mkdir build2
# cd build2
# cmake -DPLATFORM=${{ matrix.raylib-platform }} -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DPLATFORM=SDL -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
# make -j2
# sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
#
# - name: Copy extras
# run: |
# sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
# sudo cp physac/src/physac.h /usr/local/include/
# sudo cp raygui/src/raygui.h /usr/local/include/
#
# - name: Build raylib-python-cffi
# run: |
# python -m pip install --upgrade pip
# pip3 install "cffi>=1.17.1"
# pip3 install wheel
# pip3 install setuptools
# RAYLIB_PLATFORM=${{ matrix.raylib-platform }} python setup.py bdist_wheel
#
# - name: Upload build Artifact wheel
# uses: actions/upload-artifact@v3.2.1
# with:
# name: wheel
# path: dist/*
#
# # Name defaults to universal2 and it technically is, but we override name to arm64. Why don't we make a working universal2 wheel? Because
# # I'd rather have a separate x86_64 that I can test, and I want it to work on 10_15 but I'm not sure a 'macosx_10_15_universal2' is valid
# # given that there is no SDK for universal until macosx_11_0
# - name: Build raylib-python-cffi
# run: |
# python -m pip install --upgrade pip
# pip3 install cffi
# pip3 install wheel
# python setup.py bdist_wheel --plat-name macosx_12_0_arm64
build-linux:
runs-on: ubuntu-22.04
strategy:
# You can use PyPy versions in python-version.
# For example, pypy2 and pypy3
matrix:
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ]
raylib-platform: ['Desktop', 'SDL', 'DRM']
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Python
uses: actions/setup-python@v5
with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version }}
# The target architecture (x86, x64) of the Python interpreter.
architecture: x64
- name: install prereqs
run: |
sudo apt update
sudo apt install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev libwayland-dev libxkbcommon-dev
- name: Build SDL
run: |
wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
tar xvfz release-2.30.7.tar.gz
mkdir build
cd build
cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
sudo cmake --install .
# Runs a set of commands using the runners shell # Runs a set of commands using the runners shell
- name: Build raylib - name: Build raylib
run: | run: |
cd raylib-c cd raylib-c
mkdir build mkdir build
cd build cd build
cmake -DPLATFORM=${{ matrix.raylib-platform }} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release -DOpenGL_GL_PREFERENCE=GLVND .. cmake -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo make install
- name: Copy extras
run: |
sudo cp physac/src/physac.h /usr/local/include/
sudo cp raygui/src/raygui.h /usr/local/include/
- name: Build raylib-python-cffi
run: |
python -m pip install --upgrade pip
pip3 install cffi
pip3 install wheel
python setup.py bdist_wheel
- name: Upload build Artifact wheel
uses: actions/upload-artifact@v2.2.4
with:
name: wheel
path: dist/*
build-mac12-test:
runs-on: macos-12
strategy:
matrix:
python-version: ['3.10', '3.11.0-alpha - 3.11.0' ]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Setup Python
uses: actions/setup-python@v2.2.2
with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version }}
# The target architecture (x86, x64) of the Python interpreter.
architecture: x64
# Runs a set of commands using the runners shell
- name: Build raylib
run: |
cd raylib-c
mkdir build
cd build
cmake -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
make -j2 make -j2
sudo make install sudo make install
- name: Copy extras - name: Copy extras
run: | run: |
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
sudo cp physac/src/physac.h /usr/local/include/ sudo cp physac/src/physac.h /usr/local/include/
sudo cp raygui/src/raygui.h /usr/local/include/ sudo cp raygui/src/raygui.h /usr/local/include/
- name: Build raylib-python-cffi - name: Build raylib-python-cffi
env:
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip3 install "cffi>=1.17.1" pip3 install cffi
pip3 install wheel pip3 install wheel
pip3 install setuptools python setup.py bdist_wheel
python setup.py bdist_wheel --plat-name manylinux2014_x86_64
- name: Test build-linux:
runs-on: ubuntu-18.04
strategy:
# You can use PyPy versions in python-version.
# For example, pypy2 and pypy3
matrix:
python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11.0-alpha - 3.11.0', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9' ]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Setup Python
uses: actions/setup-python@v2.2.2
with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version }}
# The target architecture (x86, x64) of the Python interpreter.
architecture: x64
# Runs a set of commands using the runners shell
- name: Build raylib
run: | run: |
pip3 install dist/*.whl sudo apt update
cd / sudo apt install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
python3 -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true cd raylib-c
cat /tmp/output mkdir build
if grep -q "INFO: Initializing raylib" /tmp/output; then cd build
echo "Passed" cmake -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
exit 0 make -j2
else sudo make install
echo "Failed" - name: Copy extras
exit 1 run: |
fi sudo cp physac/src/physac.h /usr/local/include/
sudo cp raygui/src/raygui.h /usr/local/include/
- name: Build raylib-python-cffi
run: |
python -m pip install --upgrade pip
pip3 install cffi
pip3 install wheel
python setup.py bdist_wheel --plat-name manylinux2014_x86_64
- name: Upload build Artifact wheel - name: Upload build Artifact wheel
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v2.2.4
with: with:
name: wheel-linux-${{ matrix.raylib-platform }}-${{ matrix.python-version }} name: wheel
path: dist/* path: dist/*
build-windows: build-windows:
# The type of runner that the job will run on # The type of runner that the job will run on
runs-on: windows-2019 runs-on: windows-2019
@ -271,27 +156,15 @@ jobs:
# You can use PyPy versions in python-version. # You can use PyPy versions in python-version.
# For example, pypy2 and pypy3 # For example, pypy2 and pypy3
matrix: matrix:
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ] python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11.0-alpha - 3.11.0', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9' ]
raylib-platform: ['Desktop', 'SDL']
steps: steps:
- uses: actions/checkout@v4 # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with: with:
submodules: recursive submodules: recursive
- name: Download SDL2
run: curl -L -o SDL2.zip https://github.com/libsdl-org/SDL/releases/download/release-2.30.8/SDL2-devel-2.30.8-VC.zip
- name: Create extraction directory
run: mkdir ${{ runner.temp }}\SDL2
- name: Unzip SDL2
run: tar -xf SDL2.zip -C ${{ runner.temp }}\SDL2 --strip-components=1
- name: Set SDL2_DIR environment variable
run: echo SDL2_DIR=${{ runner.temp }}\SDL2\cmake >> $env:GITHUB_ENV
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v2.2.2
with: with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax. # Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
@ -299,142 +172,109 @@ jobs:
architecture: x64 architecture: x64
- name: Add msbuild to PATH - name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2 uses: microsoft/setup-msbuild@v1.0.2
- name: Build raylib - name: Build raylib
run: | run: |
cd raylib-c cd raylib-c
mkdir build mkdir build
cd build cd build
cmake -DPLATFORM=${{ matrix.raylib-platform }} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
msbuild raylib.sln /target:raylib /property:Configuration=Release msbuild raylib.sln /target:raylib /property:Configuration=Release
copy raylib\Release\raylib.lib ..\.. copy raylib\Release\raylib.lib ..\..
cd ..\.. cd ..\..
shell: cmd shell: cmd
- name: Build raylib-python-cffi - name: Build raylib-python-cffi
env:
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
run: | run: |
copy ${{ runner.temp }}\SDL2\lib\x64\SDL2.lib .
copy ${{ runner.temp }}\SDL2\lib\x64\SDL2.dll raylib\
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip3 install "cffi>=1.17.1" pip3 install cffi
pip3 install wheel pip3 install wheel
pip3 install setuptools
del raylib\dynamic\*.so* >nul 2>&1 del raylib\dynamic\*.so* >nul 2>&1
del raylib\dynamic\*.dll >nul 2>&1 del raylib\dynamic\*.dll >nul 2>&1
del raylib\dynamic\*.dylib >nul 2>&1 del raylib\dynamic\*.dylib >nul 2>&1
del raylib\dynamic\32bit\* >nul 2>&1 del raylib\dynamic\32bit\* >nul 2>&1
python setup.py bdist_wheel python setup.py bdist_wheel
shell: cmd shell: cmd
- name: Test
shell: bash
run: |
pip3 install --no-deps dist/*.whl
cd /
python3 -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
cat /tmp/output
if grep -q "INFO: Initializing raylib" /tmp/output; then
echo "Passed"
exit 0
else
echo "Failed"
exit 1
fi
- name: Upload build Artifact wheel - name: Upload build Artifact wheel
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v2.2.4
with: with:
name: wheel-windows-${{ matrix.raylib-platform }}-${{ matrix.python-version }} name: wheel
path: dist/* path: dist/*
source-distro: source-distro:
runs-on: ubuntu-latest runs-on: ubuntu-18.04
steps: steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4 - uses: actions/checkout@v2
with: with:
submodules: recursive submodules: recursive
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v2.2.2
with: with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax. # Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: '3.12' python-version: '3.10'
# The target architecture (x86, x64) of the Python interpreter. # The target architecture (x86, x64) of the Python interpreter.
architecture: x64 architecture: x64
- name: Build raylib - name: Build raylib
run: | run: |
sudo apt update sudo apt update
sudo apt install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev libwayland-dev libxkbcommon-dev sudo apt install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
cd raylib-c cd raylib-c
mkdir build mkdir build
cd build cd build
cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
make -j2 make -j2
sudo make install sudo make install
- name: Copy extras - name: Copy extras
run: | run: |
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
sudo cp physac/src/physac.h /usr/local/include/ sudo cp physac/src/physac.h /usr/local/include/
sudo cp raygui/src/raygui.h /usr/local/include/ sudo cp raygui/src/raygui.h /usr/local/include/
- name: Build raylib-python-cffi - name: Build raylib-python-cffi
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip3 install "cffi>=1.17.1" pip3 install cffi
pip3 install wheel pip3 install wheel
pip3 install setuptools
python setup.py sdist python setup.py sdist
- name: Upload build Artifact wheel - name: Upload build Artifact wheel
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v2.2.4
with: with:
name: wheel-source name: wheel
path: dist/* path: dist/*
dynamic-distro: dynamic-distro:
runs-on: ubuntu-latest runs-on: ubuntu-18.04
steps: steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4 - uses: actions/checkout@v2
with: with:
submodules: recursive submodules: recursive
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v2.2.2
with: with:
# Version range or exact version of a Python version to use, using SemVer's version range syntax. # Version range or exact version of a Python version to use, using SemVer's version range syntax.
python-version: '3.12' python-version: '3.10'
# The target architecture (x86, x64) of the Python interpreter. # The target architecture (x86, x64) of the Python interpreter.
architecture: x64 architecture: x64
- name: Build raylib-python-cffi-dynamic - name: Build raylib-python-cffi-dynamic
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip3 install "cffi>=1.17.1" pip3 install cffi
pip3 install wheel pip3 install wheel
pip3 install setuptools
cd dynamic cd dynamic
python setup.py sdist python setup.py sdist
- name: Upload build Artifact wheel - name: Upload build Artifact wheel
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v2.2.4
with:
name: wheel-dynamic
path: dynamic/dist/*
merge:
needs: [build-mac-intel, build-windows, build-linux, source-distro, dynamic-distro]
runs-on: ubuntu-latest
steps:
- name: Merge All Artifacts
uses: actions/upload-artifact/merge@v4
with: with:
name: wheel name: wheel
pattern: wheel-* path: dynamic/dist/*

4
.gitmodules vendored
View file

@ -1,9 +1,9 @@
[submodule "raylib-c"] [submodule "raylib-c"]
path = raylib-c path = raylib-c
url = https://git.terah.dev/UnrealXR/raylib.git url = https://github.com/raysan5/raylib.git
[submodule "raygui"] [submodule "raygui"]
path = raygui path = raygui
url = https://github.com/raysan5/raygui.git url = https://github.com/raysan5/raygui.git
[submodule "physac"] [submodule "physac"]
path = physac path = physac
url = https://github.com/victorfisac/Physac.git url = https://github.com/raysan5/physac.git

View file

@ -9,14 +9,12 @@ This is useful if the binaries dont work on your system, or you want to use a
First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this
is to compile and install Raylib using CMake: https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake is to compile and install Raylib using CMake: https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake
Requirements for build: cmake, pkg-config.
:: ::
cd raylib-5.0 cd raylib-4.0.0
mkdir build mkdir build
cd build cd build
cmake -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
make make
sudo make install sudo make install
@ -26,7 +24,7 @@ Then ask Pip to build from source:
:: ::
pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib pip3 install --no-binary raylib --upgrade --force-reinstall raylib
Or, Build from source manually Or, Build from source manually
------------------------------ ------------------------------
@ -38,7 +36,7 @@ project.
If the Pip build doesnt work, please submit a bug. (And if you have If the Pip build doesnt work, please submit a bug. (And if you have
fixed it, a PR.) fixed it, a PR.)
Manual instructions follow, but are probably outdated, so see instead how we actually build the wheels Manual instructions follow, but may be outdated, so see also how we actually build the wheels
at https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml at https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml
Windows manual build Windows manual build
@ -83,6 +81,11 @@ To build a binary wheel distribution:
pip3 install wheel pip3 install wheel
python setup.py bdist_wheel python setup.py bdist_wheel
.. TODO::
There's a hardcoded path (to the raylib header files) in `raylib/build.py` you will probably need to edit.
Would be useful if some Windows user could figure out how to auto detect this.
Then install it: Then install it:
:: ::
@ -110,11 +113,11 @@ Build and install Raylib from the raylib-c directory.
:: ::
sudo apt install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config cmake sudo apt install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
cd raylib-python-cffi/raylib-c cd raylib-python-cffi/raylib-c
mkdir build mkdir build
cd build cd build
cmake -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
sudo make install sudo make install
.. note:: Optional: Build the Raylib shared libs, if you plan to use .. note:: Optional: Build the Raylib shared libs, if you plan to use
@ -132,7 +135,7 @@ Build and install Raylib from the raylib-c directory.
cd ../.. cd ../..
Build the Python library: Build
:: ::
@ -214,3 +217,37 @@ Build and install module.
python3 setup.py install python3 setup.py install
Raspberry Pi
~~~~~~~~~~~~
Latest info: https://github.com/electronstudio/raylib-python-cffi/issues/55#issuecomment-1012629701
Old possibly out of date info that was written for RPi3 and Raylib 3 follows.
The integrated GPU hardware in a Raspberry Pi (“VideoCore”) is rather
idiosyncratic, resulting in a complex set of software options. Probably
the most interesting two options for Raylib applications are:
1. Use the Broadcom proprietary Open GL ES 2.0 drivers, installed by
Raspbian into ``/opt/vc``. These are 32-bit only, and currently X11
doesnt use these for its acceleration, so this is most suitable for
driving the entire HDMI output from one application with minimal
overhead (no X11).
2. Use the more recent open-source ``vc4-fkms-v3d`` kernel driver. This
can run in either 32-bit or 64-bit, and X11 can use these, so using
X11 is probably the more common choice here.
With option 2, the regular linux install instructions above should
probably work as-is.
For option 1, then also follow the above instructions, but with these
modifications:
- With ``cmake``, use
``cmake -DWITH_PIC=on -DSTATIC=on -DSHARED=on -DPLATFORM='Raspberry Pi' ..``
(See
`here <https://github.com/electronstudio/raylib-python-cffi/issues/31#issuecomment-862078330>`__
for a Raspberry Pi wheel)

View file

@ -2,15 +2,9 @@ include raylib/*.so
include raylib/*.pyi include raylib/*.pyi
include pyray/*.pyi include pyray/*.pyi
include raylib/*.pyd include raylib/*.pyd
include raylib/*.dll
exclude raylib/*.a exclude raylib/*.a
include raylib/*.h include raylib/*.h
include raylib/*.h.modified
exclude raylib/*.c exclude raylib/*.c
exclude raylib/*.o exclude raylib/*.o
include version.py include version.py
exclude tests/*
include raylib/py.typed
include pyray/py.typed

261
README.md
View file

@ -1,216 +1,79 @@
# Python Bindings for Raylib 5.5 # Python Bindings for Raylib 4.2
## Libraries: raymath, raygui, rlgl, physac and GLFW
## Backends: Desktop, SDL, DRM, Web
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
![PyPI - Downloads](https://img.shields.io/pypi/dm/raylib) New CFFI API static bindings.
Chatroom: [Discord](https://discord.gg/fKDwt85aX6)
HELP WANTED: [writing examples](https://github.com/electronstudio/raylib-python-cffi/issues/155)
Features:
* CFFI API static bindings.
* Automatically generated to be as close as possible to * Automatically generated to be as close as possible to
original Raylib. original Raylib.
* Faster, fewer bugs and easier to maintain than ctypes. * Faster, fewer bugs and easier to maintain than ctypes.
* Commercial-friendly license. * Commercial-friendly license.
* Docstrings and auto-completion. * Docstrings and auto-completion.
* Type checking with Mypy * **Now includes extra libraries: raymath, raygui, rlgl and physac**
[Full documentation](http://electronstudio.github.io/raylib-python-cffi) [Full documentation](http://electronstudio.github.io/raylib-python-cffi)
# Quickstart # Quickstart
`pip3 install raylib==5.5.0.2 --break-system-packages` `pip3 install raylib`
```python
from pyray import *
init_window(800, 450, "Hello")
while not window_should_close():
begin_drawing()
clear_background(WHITE)
draw_text("Hello world", 190, 200, 20, VIOLET)
end_drawing()
close_window()
```
# Installation from pyray import *
init_window(800, 450, "Hello")
If you are on a modern Linux you will probably want to create a venv:
python3 -m venv venv
source venv/bin/activate
Then make sure you have the latest pip installed:
python3 -m pip install --upgrade pip
Then install
python3 -m pip install setuptools
python3 -m pip install raylib==5.5.0.2
On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from
source, in which case you will need to have Raylib development libs installed, e.g.
using homebrew, apt, etc.
## Windows
Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)
Use an [official Windows Python release](https://www.python.org/downloads/windows/) rather than WSL, MSYS, etc.
## MacOS
Binaries require:
* arm64 MacOS 14
* x64 MacOS 10.13, or newer.
Older MacOS requires building from source but this is usually simple:
brew install pkg-config
brew install raylib
python3 -m pip install raylib==5.5.0.2
(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue
if you want to test them.)
## Linux
Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source.
(Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)
The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0
so may not work on other boards.
## Raspberry Pi
[Using on Rasperry Pi](RPI.rst)
# Backends
## Dynamic binding version
There is now a separate dynamic version of this binding:
python3 -m pip uninstall raylib
python3 -m pip install raylib_dynamic
It works on some systems where the static version doesn't, [but be sure to read these caveats before using it](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
You can't have multiple raylib packages installed at once.
## SDL backend
This is not well tested but has better support for controllers:
python3 -m pip uninstall raylib
python3 -m pip install raylib_sdl
You can't have multiple raylib packages installed at once.
## DRM backend
This uses the Linux framebuffer for devices that don't run X11/Wayland:
python3 -m pip uninstall raylib
python3 -m pip install raylib_drm
You can't have multiple raylib packages installed at once.
## Problems?
If it doesn't work, [try to build manually.](BUILDING.rst). If that works then [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues)
to let us know what you did.
If you need help you can try asking on [our discord](https://discord.gg/fKDwt85aX6). There is also a large [Raylib discord](https://discord.gg/raylib)
for issues that are not Python-specific.
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
# How to use
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
pyray. Do *not* `pip install pyray`). You can use either or both:
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
Use [the raylib module](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
### If you prefer a more Pythonistic API
Use [the pyray module](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
# Running in a web browser
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser. Usually the latest git version
is recommended.
Make a folder `my_project` with a file `main.py`:
```python
# /// script
# dependencies = [
# "cffi",
# "raylib"
# ]
# ///
import asyncio
import platform
from pyray import *
async def main(): # You MUST have an async main function
init_window(500, 500, "Hello")
platform.window.window_resize() # You MAY want to add this line
while not window_should_close(): while not window_should_close():
begin_drawing() begin_drawing()
clear_background(WHITE) clear_background(WHITE)
draw_text("Hello world", 190, 200, 20, VIOLET) draw_text("Hello world", 190, 200, 20, VIOLET)
end_drawing() end_drawing()
await asyncio.sleep(0) # You MUST call this in your main loop
close_window() close_window()
asyncio.run(main())
```
Then to create the web files and launch a web server: # Installation
python3.12 -m pip install --user --upgrade pygbag First make sure you have the latest pip installed:
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
Point your browser to http://localhost:8000 python3 -m pip install --upgrade pip
Some features may not work, so you can disable them like this: Then install
```python python3 -m pip install raylib
if platform.system() != "Emscripten": # audio may not work on current version of emscripten
init_audio_device()
```
This is all done by Pygbag rather than by me, so you should probably contact them with any issues. On most platforms it should install a binary wheel (Windows 10 x64, MacOS 10.15 x64, Linux Ubuntu1804 x64).
Carefully read all their [documentation](https://pygame-web.github.io/).
It does work for most of [these examples](https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/) If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g.
using homebrew, apt, etc.
[If it doesn't work, you can build manually.](BUILDING.rst)
## Dynamic binding version
There is now a separate dynamic version of this binding:
python3 -m pip install raylib_dynamic
[Read this before using raylib_dynamic](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
## Beta testing
You can install an alpha or beta version by specifying the exact version number like this:
python3 -m pip install raylib==4.0a6
# How to use
There are two APIs, you can use either or both:
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
Use [the C API](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
### If you prefer a slightly more Pythonistic API and don't mind it might be slightly slower
Use [the Python API](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
# App showcase # App showcase
[Tempest-raylib](https://github.com/Emtyloc/tempest-raylib)
[KarabinerKeyboard](https://github.com/bilbofroggins/KarabinerKeyboard)
[PyTaiko](https://github.com/Yonokid/PyTaiko)
[DOOM-Clone](https://github.com/StanislavPetrovV/DOOM-Clone)
[Tanki](https://github.com/pkulev/tanki) [Tanki](https://github.com/pkulev/tanki)
[Alloy Bloxel Editor](https://pebaz.itch.io/alloy-bloxel-editor) [Alloy Bloxel Editor](https://pebaz.itch.io/alloy-bloxel-editor)
[Eidolon](https://github.com/Miou-zora/Eidolon)
Add your app here! Add your app here!
# RLZero # RLZero
@ -224,43 +87,29 @@ A related library (that is a work in progress!):
* Converting more examples from C to Python * Converting more examples from C to Python
* Testing on more platforms * Testing on more platforms
# License # License (updated)
Eclipse Public License, so you are free to The bindings are now under the Eclipse Public License, so you are free to
statically link and use in non-free / proprietary / commercial projects! statically link and use in non-free / proprietary / commercial projects!
# Performance # Performance
If you need more performance, do in this order: For fastest performance use Pypy rather than standard Python.
1. Use Pypy rather than standard CPython. It is much, much faster and will make more difference than any other optimisations you might do. Every call to C is costly, so it's slightly faster if you use Python data structures and functions when calculating
2. Every call to C is costly, so it's slightly faster if you use Python data structures and functions when calculating
in your update loop in your update loop
and then only convert them to C data structures when you have to call the C functions for drawing. and then only convert them to C data structures when you have to call the C functions for drawing.
3. The raylib.* functions are potentially *slightly* faster than the pyray.* equivalents, so if you need a tiny bit more performance
you can switch your inner loop functions to these.
4. There is a version of Python that is faster than Pypy: GraalPy. However it's not fully compatible with all Python
packages. It doesn't work with CFFI and so doesn't work with this binding. But it *is* compatible with the
*Java* binding, Jaylib! There is an example of this here: https://github.com/electronstudio/megabunny/tree/master/raylib-python-jaylib
## Bunnymark ## Bunnymark
| Library | Implementation | Bunnies (60 FPS) | Percentage | | Library | Implementation | Bunnies (60 FPS) | Percentage |
|--------------------------------|-------------------|------------------|------------| | ------------- | ------------- | ------------- | ------------- |
| Raylib 5.0 | C | 180000 | 100% | | Raylib 3.7 | C | 168100 | 100% |
| Raylib Python CFFI 5.0.0.2 | Python 3.12 | 10500 | 5.8% | | Raylib Python CFFI 3.7 | Pypy 3.7 | 33800 | 20% |
| Raylib Python CFFI 5.0.0.2 | Pypy 3.10 | 95000 | 53% | | Raylib Python CFFI 3.7 | Python 3.9 | 7700 | 4.5% |
| Raylib 3.7 | C | 168100 | 100% | | Raylib Python CFFI 3.7 | Python 3.9 Nuitka | 8600 | 5.1% |
| Raylib Python CFFI 3.7 | Pypy 3.7 | 33800 | 20% | | Raylib Python CFFI 3.7 Dynamic | Python 3.9 | 6300 | 3.7% |
| Raylib Python CFFI 3.7 | Python 3.9 | 7700 | 4.5% |
| Raylib Python CFFI 3.7 | Python 3.9 Nuitka | 8600 | 5.1% |
| Raylib Python CFFI 3.7 Dynamic | Python 3.9 | 6300 | 3.7% |
See also https://github.com/electronstudio/megabunny/
# Packaging your app # Packaging your app
@ -275,4 +124,4 @@ You can create a standalone binary using the Nuitka compiler. For example, here
[RetroWar: 8-bit Party Battle](https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git) is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games. [RetroWar: 8-bit Party Battle](https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git) is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games.
[Coding Games With Pygame Zero & Python](https://github.com/electronstudio/pygame-zero-book) is [Coding Games With Pygame Zero & Python](https://github.com/electronstudio/pygame-zero-book) is
a book for Python beginners. a book for Python beginners.

97
RPI.rst
View file

@ -1,97 +0,0 @@
Raspberry Pi
====================
Please use Raspberry Pi OS Bookworm. Bullseye should also work. Older OSes are not tested.
Option 1: Binary wheel
----------------------
We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11 mode.
::
python -m pip install --break-system-packages raylib
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
installed at once.
If it doesn't work, or you're not on Bullseye, or you're 32 bit, you will need to compile your own raylib. See below.
For full instructions on this, see https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi . If you need help with this ask Raylib.
Option 2: Compile Raylib from source X11 mode
---------------------------------------------
This should work for everyone.
::
sudo apt update
sudo apt install python3-pip cmake libegl1-mesa-dev libgbm-dev libgles2-mesa-dev libdrm-dev libglfw3-dev
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
cd raylib
mkdir build
rm -rf build/*
cd build
cmake -DPLATFORM="Desktop" -DOPENGL_VERSION=2.1 -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
make
sudo make install
sudo cp -r ../src/external/glfw/include/GLFW /usr/local/include/
Then have pip compile and install the wheel:
::
python3 -m pip install --break-system-packages setuptools
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
Option 3: Compile Raylib from source DRM mode
---------------------------------------------
This seems to work on Raspberry Pi 4. Note you must not be running X11 when you run your programs.
If you have ever installed Raylib or raylib-python-cffi before, remove all traces of it:
::
sudo apt remove raylib raylib-dev libraylib libraylib-dev
sudo rm /usr/local/lib/pkgconfig/raylib.pc
sudo rm -rf /usr/local/lib/libraylib.* /usr/lib/libraylib.*
Remove all GLFW:
::
sudo apt remove libglfw3-dev libglfw3
sudo rm -rf /usr/local/include/GLFW
Build a shared lib version of Raylib in DRM mode and install to /usr:
::
sudo apt update
sudo apt install python3-pip cmake libegl1-mesa-dev libgbm-dev libgles2-mesa-dev libdrm-dev
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
cd raylib
mkdir build
rm rf build/*
cd build
cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo make install
Then have pip compile and install the wheel:
::
python3 -m pip install --break-system-packages setuptools
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
.. attention::
If you intend to use the Broadcom proprietary Open GL ES 2.0 drivers (the ones installed by Raspbian into ``/opt/vc`` and compiled in Raylib
with ``PLATFORM_RPI``) be aware they not work with Bullseye and have not been tested with the bindings. They will probably
require additional linker arguments to be added to ``build.py``. Suggest you try ``PLATFORM_DRM`` instead.

View file

@ -1,105 +0,0 @@
# Copyright (c) 2021 Richard Smith and others
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# This Source Code may also be made available under the following Secondary
# licenses when the conditions for such availability set forth in the Eclipse
# Public License, v. 2.0 are satisfied: GNU General Public License, version 2
# with the GNU Classpath Exception which is
# available at https://www.gnu.org/software/classpath/license.html.
#
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
from raylib import rl, ffi
from inspect import ismethod, getmembers, isbuiltin
import inflection, sys, json, re
two_or = re.compile(r'''\(\s*([^\s]*)\s*\|\s*([^\s]*)\s*\)''')
three_or = re.compile(r'''\(\s*([^\s]*)\s*\|\s*([^\s]*)\s*\|\s*(^\s*)\s*\)''')
two_mult = re.compile(r'''\(\s*([^\s]*)\s*\*\s*([^\s]*)\s*\)''')
two_div = re.compile(r'''\(\s*([^\s]*)\s*/\s*([^\s]*)\s*\)''')
def process(filename):
f = open(filename, "r")
js = json.load(f)
known_define = []
known_enum = []
for e in js['enums']:
if e['name'] and e['values']:
for v in e['values']:
if v['name']:
known_enum.append(str(v['name']).strip())
for e in js['defines']:
if e['type'] in ('INT', 'FLOAT', 'STRING'):
if e['type'] == 'INT':
print(e['name'] + ": int = " + str(e['value']).strip())
elif e['type'] == 'FLOAT':
print(e['name'] + ": float = " + str(e['value']).strip())
else:
print(e['name'] + ": str = \"" + str(e['value']).strip() + '"')
known_define.append(str(e['name']).strip())
elif e['type'] == "UNKNOWN":
strval = str(e['value']).strip()
if strval.startswith("__"):
continue
if strval in known_enum:
print(e['name'] + " = raylib." + strval)
elif strval in known_define:
print(e['name'] + " = " + strval)
else:
matches = two_or.match(strval)
if not matches:
matches = three_or.match(strval)
if matches:
match_defs = [str(m).strip() for m in matches.groups()]
if all(d in known_enum for d in match_defs):
print(e['name'] + " = " + " | ".join(("raylib."+m) for m in match_defs))
elif all(d in known_define for d in match_defs):
print(e['name'] + " = " + " | ".join(match_defs))
else:
continue
known_define.append(str(e['name']).strip())
elif e['type'] == "FLOAT_MATH":
strval = str(e['value']).strip()
matches = two_mult.match(strval)
if matches:
match_defs = [str(m).strip() for m in matches.groups()]
match_parts = []
for m in match_defs:
if "." in m:
match_parts.append(m.rstrip("f"))
else:
match_parts.append(m)
if all(d in known_enum for d in match_parts):
print(e['name'] + " = " + " * ".join(("raylib." + m) for m in match_parts))
elif all(d in known_define for d in match_parts):
print(e['name'] + " = " + " * ".join(match_parts))
else:
matches = two_div.match(strval)
if matches:
match_defs = [str(m).strip() for m in matches.groups()]
match_parts = []
for m in match_defs:
if "." in m:
match_parts.append(m.rstrip("f"))
else:
match_parts.append(m)
if any(d in known_enum for d in match_parts):
print(e['name'] + " = " + " / ".join(("raylib." + m) for m in match_parts))
elif any(d in known_define for d in match_parts):
print(e['name'] + " = " + " / ".join(match_parts))
else:
continue
print("import raylib\n")
process("raylib.json")
process("raymath.json")
process("rlgl.json")
process("raygui.json")
process("physac.json")
process("glfw3.json")

View file

@ -24,7 +24,6 @@ def process(filename):
for e in js['enums']: for e in js['enums']:
if e['name'] and e['values']: if e['name'] and e['values']:
print ("class "+e['name']+"("+"IntEnum):") print ("class "+e['name']+"("+"IntEnum):")
print(f' """{e['description']}."""')
for value in e['values']: for value in e['values']:
print(" "+value['name']+" = "+str(value['value'])) print(" "+value['name']+" = "+str(value['value']))
print("") print("")
@ -34,5 +33,4 @@ print("""from enum import IntEnum
process("raylib.json") process("raylib.json")
process("raygui.json") process("raygui.json")
process("glfw3.json")
process("physac.json")

View file

@ -12,32 +12,13 @@
# #
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 # SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
from pathlib import Path
from raylib import rl, ffi from raylib import rl, ffi
from pyray import _underscore
from inspect import ismethod, getmembers, isbuiltin from inspect import ismethod, getmembers, isbuiltin
import inflection, sys, json import inflection, sys, json
known_functions = {} f = open("raylib.json", "r")
known_structs = {} js = json.load(f)
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"),
Path("glfw3.json")):
f = open(filename, "r")
js = json.load(f)
for fn in js["functions"]:
if fn["name"] not in known_functions:
known_functions[fn["name"]] = fn
for st in js["structs"]:
if st["name"] not in known_structs:
known_structs[st["name"]] = st
for e in js['enums']:
if e['name'] and e['values']:
print("class "+e['name']+"(int):")
print(f' """{e['description']}."""')
for value in e['values']:
print(" "+value['name']+" = "+str(value['value']))
print("")
def ctype_to_python_type(t): def ctype_to_python_type(t):
if t == '_Bool': if t == '_Bool':
@ -48,69 +29,48 @@ def ctype_to_python_type(t):
return "int" return "int"
elif t == "unsigned long long": elif t == "unsigned long long":
return "int" return "int"
elif t == "uint64_t":
return "int"
elif t == "short":
return "int"
elif t == "unsigned short":
return "int"
elif t == "double": elif t == "double":
return "float" return "float"
elif "char * *" in t:
return "list[str]"
elif "char *" in t: elif "char *" in t:
return "str" return "str"
elif t == "char": elif "char" in t:
return "str" # not sure about this one return "str" # not sure about this one
elif t == "unsigned char":
return "int"
elif "*" in t: elif "*" in t:
return "Any" return "Any"
elif "[" in t:
return "list" # TODO FIXME type of items in the list
elif t.startswith("struct"): elif t.startswith("struct"):
return t.replace("struct ", "") return t.replace("struct ","")
elif t.startswith("unsigned"): elif t.startswith("unsigned"):
return t.replace("unsigned ", "") return t.replace("unsigned ", "")
elif t.startswith("enum"):
return t.replace("enum ", "")
else: else:
return t return t
print("""from typing import Any print("""from typing import Any
from warnings import deprecated
import _cffi_backend # type: ignore
ffi: _cffi_backend.FFI
PhysicsShapeType = int def pointer(struct):
...
""") """)
# These words can be used for c arg names, but not in python
reserved_words = ("in", "list", "tuple", "set", "dict", "from", "range", "min", "max", "any", "all", "len")
for name, attr in getmembers(rl): for name, attr in getmembers(rl):
uname = _underscore(name) uname = inflection.underscore(name).replace('3_d', '_3d').replace('2_d', '_2d')
if isbuiltin(attr) or str(type(attr)) == "<class '_cffi_backend.__FFIFunctionWrapper'>": if isbuiltin(attr) or str(type(attr)) == "<class '_cffi_backend.__FFIFunctionWrapper'>":
json_object = known_functions.get(name, None) json_array = [x for x in js['functions'] if x['name'] == name]
if json_object is None: json_object = {}
# this is _not_ an exported function from raylib, raymath, rlgl raygui or physac if len(json_array) > 0:
# so we don't want it in the pyray API json_object = json_array[0]
continue
sig = "" sig = ""
for i, arg in enumerate(ffi.typeof(attr).args): for i, arg in enumerate(ffi.typeof(attr).args):
param_name = arg.cname.replace("struct", "").replace("char *", "str").replace("*", param_name = arg.cname.replace("struct", "").replace("char *", "str").replace("*",
"_pointer").replace( "_pointer").replace(
" ", "") + "_" + str(i) " ", "")+"_"+str(i)
if 'params' in json_object: if 'params' in json_object:
p = json_object['params'] p = json_object['params']
param_name = list(p)[i]['name'] param_name = list(p)[i]['name']
# don't use a python reserved word:
if param_name in reserved_words:
param_name = param_name + "_" + str(i)
param_type = ctype_to_python_type(arg.cname) param_type = ctype_to_python_type(arg.cname)
if "struct" in arg.cname:
param_type += "|list|tuple"
sig += f"{param_name}: {param_type}," sig += f"{param_name}: {param_type},"
return_type = ffi.typeof(attr).result.cname return_type = ffi.typeof(attr).result.cname
@ -120,77 +80,42 @@ for name, attr in getmembers(rl):
if 'description' in json_object: if 'description' in json_object:
description = json_object['description'] description = json_object['description']
if 'physics' in uname: print(
print('@deprecated("Raylib no longer recommends the use of Physac library")') f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:\n """{description}"""\n ...')
print(f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:')
print(f' """{description}."""')
print(f' ...')
elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>": elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>":
return_type = ffi.typeof(attr).result.cname return_type = ffi.typeof(attr).result.cname
print( print(
f'def {uname}(*args) -> {ctype_to_python_type(return_type)}:\n """VARARG FUNCTION - MAY NOT BE SUPPORTED BY CFFI"""\n ...') f'def {uname}(*args) -> {ctype_to_python_type(return_type)}:\n """VARARG FUNCTION - MAY NOT BE SUPPORTED BY CFFI"""\n ...')
else: else:
# print("*****", str(type(attr))) #print("*****", str(type(attr)))
t = str(type(attr))[8:-2] # this isolates the type t = str(type(attr))[8:-2] # this isolates the type
if t != "int": if t != "int":
print(f"{name}: {t}") print(f"{name}: {t}")
for struct in ffi.list_types()[0]: for struct in ffi.list_types()[0]:
print("processing", struct, file=sys.stderr) print("processing", struct, file=sys.stderr)
# json_array = [x for x in js['structs'] if x['name'] == name]
# json_object = {}
# if len(json_array) > 0:
# json_object = json_array[0]
if ffi.typeof(struct).kind == "struct": if ffi.typeof(struct).kind == "struct":
json_object = known_structs.get(struct, None)
if json_object is None:
# this is _not_ an exported struct from raylib, raymath, rlgl raygui or physac
# so we don't want it in the pyray API
continue
if ffi.typeof(struct).fields is None: if ffi.typeof(struct).fields is None:
print("weird empty struct, skipping " + struct, file=sys.stderr) print("weird empty struct, skipping "+struct, file=sys.stderr)
continue continue
print(f"class {struct}:") print(f"class {struct}:")
print(f' """{known_structs[struct]['description']}."""') print(f' """ struct """')
sig = "" sig = ""
for arg in ffi.typeof(struct).fields: for arg in ffi.typeof(struct).fields:
ptype = ctype_to_python_type(arg[1].type.cname) sig += ", " + arg[0]
if arg[1].type.kind == "struct":
ptype += "|list|tuple"
sig += f", {arg[0]}: {ptype}|None = None"
print(f" def __init__(self{sig}):") print(f" def __init__(self{sig}):")
for arg in ffi.typeof(struct).fields: for arg in ffi.typeof(struct).fields:
print(f" self.{arg[0]}:{ctype_to_python_type(arg[1].type.cname)} = {arg[0]} # type: ignore") print(f" self.{arg[0]}={arg[0]}")
# elif ffi.typeof(struct).kind == "enum": #elif ffi.typeof(struct).kind == "enum":
# print(f"{struct}: int") # print(f"{struct}: int")
else: else:
print("WARNING: SKIPPING UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr) print("ERROR UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr)
print("""
LIGHTGRAY : Color
GRAY : Color
DARKGRAY : Color
YELLOW : Color
GOLD : Color
ORANGE : Color
PINK : Color
RED : Color
MAROON : Color
GREEN : Color
LIME : Color
DARKGREEN : Color
SKYBLUE : Color
BLUE : Color
DARKBLUE : Color
PURPLE : Color
VIOLET : Color
DARKPURPLE : Color
BEIGE : Color
BROWN : Color
DARKBROWN : Color
WHITE : Color
BLACK : Color
BLANK : Color
MAGENTA : Color
RAYWHITE : Color
""")

View file

@ -12,23 +12,15 @@
# #
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 # SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
from pathlib import Path
from raylib import rl, ffi from raylib import rl, ffi
from inspect import ismethod, getmembers, isbuiltin from inspect import ismethod, getmembers, isbuiltin
import inflection, sys, json import inflection, sys, json
known_functions = {} f = open("raylib.json", "r")
known_structs = {} js = json.load(f)
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"),
Path("glfw3.json")):
f = open(filename, "r")
js = json.load(f)
for fn in js["functions"]:
if fn["name"] not in known_functions:
known_functions[fn["name"]] = fn
for st in js["structs"]:
if st["name"] not in known_structs:
known_structs[st["name"]] = st
def ctype_to_python_type(t): def ctype_to_python_type(t):
@ -40,73 +32,45 @@ def ctype_to_python_type(t):
return "int" return "int"
elif t == "unsigned long long": elif t == "unsigned long long":
return "int" return "int"
elif t == "uint64_t":
return "int"
elif t == "short":
return "int"
elif t == "unsigned short":
return "int"
elif t == "double": elif t == "double":
return "float" return "float"
elif "char * *" in t:
return "list[bytes]"
elif "char *" in t: elif "char *" in t:
return "bytes" return "str"
elif "char" in t: elif "char" in t:
return "bytes" # not sure about this one return "str" # not sure about this one
elif "*" in t: elif "*" in t:
return "Any" return "Any"
elif "[" in t:
return "list" # TODO FIXME type of items in the list
elif t.startswith("struct"): elif t.startswith("struct"):
return t.replace("struct ", "") return t.replace("struct ","")
elif t.startswith("unsigned"): elif t.startswith("unsigned"):
return t.replace("unsigned ", "") return t.replace("unsigned ", "")
elif t.startswith("enum"):
return t.replace("enum ", "")
else: else:
return t return t
print("""from typing import Any print("""from typing import Any
from warnings import deprecated
import _cffi_backend # type: ignore
ffi: _cffi_backend.FFI
rl: _cffi_backend.Lib
PhysicsShapeType = int
class struct: ... class struct: ...
""") """)
# These words can be used for c arg names, but not in python
reserved_words = ("in", "list", "tuple", "set", "dict", "from", "range", "min", "max", "any", "all", "len")
for name, attr in getmembers(rl): for name, attr in getmembers(rl):
uname = name uname = name
if isbuiltin(attr) or str(type(attr)) == "<class '_cffi_backend.__FFIFunctionWrapper'>": if isbuiltin(attr) or str(type(attr)) == "<class '_cffi_backend.__FFIFunctionWrapper'>":
json_object = known_functions.get(name, {}) json_array = [x for x in js['functions'] if x['name'] == name]
json_object = {}
if len(json_array) > 0:
json_object = json_array[0]
sig = "" sig = ""
for i, arg in enumerate(ffi.typeof(attr).args): for i, arg in enumerate(ffi.typeof(attr).args):
if ")(" in arg.cname: param_name = arg.cname.replace("struct", "").replace("char *", "str").replace("*",
# fn signature in arg types "_pointer").replace(
param_name = str(arg.cname).split("(", 1)[0] + "_callback_" + str(i) " ", "")+"_"+str(i)
else:
param_name = arg.cname.replace("struct", "").replace("char *", "str").replace("*",
"_pointer").replace(" ",
"") + "_" + str(
i)
if 'params' in json_object: if 'params' in json_object:
p = json_object['params'] p = json_object['params']
# print("param_name: ", param_name, "i", i, "params: ",p,file=sys.stderr) #print("param_name: ", param_name, "i", i, "params: ",p,file=sys.stderr)
param_name = list(p)[i]['name'] param_name = list(p)[i]['name']
# don't use a python reserved word:
if param_name in reserved_words:
param_name = param_name + "_" + str(i)
param_type = ctype_to_python_type(arg.cname) param_type = ctype_to_python_type(arg.cname)
if "struct" in arg.cname:
param_type += "|list|tuple"
sig += f"{param_name}: {param_type}," sig += f"{param_name}: {param_type},"
return_type = ffi.typeof(attr).result.cname return_type = ffi.typeof(attr).result.cname
@ -115,19 +79,15 @@ for name, attr in getmembers(rl):
if 'description' in json_object: if 'description' in json_object:
description = json_object['description'] description = json_object['description']
if 'Physics' in uname: print(
print('@deprecated("Raylib no longer recommends the use of Physac library")') f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:\n """{description}"""\n ...')
print(f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:')
print(f' """{description}."""')
print(f' ...')
elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>": elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>":
return_type = ffi.typeof(attr).result.cname return_type = ffi.typeof(attr).result.cname
print( print(
f'def {uname}(*args) -> {ctype_to_python_type(return_type)}:\n """VARARG FUNCTION - MAY NOT BE SUPPORTED BY CFFI"""\n ...') f'def {uname}(*args) -> {ctype_to_python_type(return_type)}:\n """VARARG FUNCTION - MAY NOT BE SUPPORTED BY CFFI"""\n ...')
else: else:
# print("*****", str(type(attr))) #print("*****", str(type(attr)))
print(f"{name}: {str(type(attr))[8:-2]}") # this isolates the type print(f"{name}: {str(type(attr))[8:-2]}") # this isolates the type
for struct in ffi.list_types()[0]: for struct in ffi.list_types()[0]:
@ -136,51 +96,18 @@ for struct in ffi.list_types()[0]:
# if ffi.typeof(struct).fields is None: # if ffi.typeof(struct).fields is None:
# print("weird empty struct, skipping", file=sys.stderr) # print("weird empty struct, skipping", file=sys.stderr)
# continue # continue
print(f"class {struct}:") print(f"{struct}: struct")
# sig = "" # sig = ""
fields = ffi.typeof(struct).fields # for arg in ffi.typeof(struct).fields:
if fields is not None: # sig += ", " + arg[0]
#print(ffi.typeof(struct).fields)
#print(f" {arg}: {arg}")
# print(f" def __init__(self{sig}):") # print(f" def __init__(self{sig}):")
# #
for arg in ffi.typeof(struct).fields: # for arg in ffi.typeof(struct).fields:
print(f" {arg[0]}: {ctype_to_python_type(arg[1].type.cname)}")
else:
print(" ...")
# print(f" self.{arg[0]}={arg[0]}") # print(f" self.{arg[0]}={arg[0]}")
elif ffi.typeof(struct).kind == "enum": elif ffi.typeof(struct).kind == "enum":
print(f"{struct} = int") print(f"{struct}: int")
else: else:
print("WARNING: SKIPPING UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr) print("ERROR UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr)
print("""
LIGHTGRAY : Color
GRAY : Color
DARKGRAY : Color
YELLOW : Color
GOLD : Color
ORANGE : Color
PINK : Color
RED : Color
MAROON : Color
GREEN : Color
LIME : Color
DARKGREEN : Color
SKYBLUE : Color
BLUE : Color
DARKBLUE : Color
PURPLE : Color
VIOLET : Color
DARKPURPLE : Color
BEIGE : Color
BROWN : Color
DARKBROWN : Color
WHITE : Color
BLACK : Color
BLANK : Color
MAGENTA : Color
RAYWHITE : Color
""")

View file

@ -1 +0,0 @@
../RPI.rst

View file

@ -15,7 +15,6 @@ Raylib Python
raylib raylib
dynamic dynamic
BUILDING BUILDING
RPI
* :ref:`search` * :ref:`search`

View file

@ -3,16 +3,7 @@ Python API
This is a wrapper around the C API with some syntactic sugar. This is a wrapper around the C API with some syntactic sugar.
The API is *still the same as Raylib*, so you should still reply on: The API is *still the same as Raylib*, so you should still reply on `the official Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_, except:
* `the C Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib examples <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
* `the C Raylib header file <https://github.com/raysan5/raylib/blob/master/src/raylib.h>`_
The *differences* are:
* the function names are in **snake_case**. * the function names are in **snake_case**.
@ -20,9 +11,6 @@ The *differences* are:
* There are some helper functions to create structures. * There are some helper functions to create structures.
Examples
--------
Example program: Example program:
.. code-block:: .. code-block::
@ -33,9 +21,10 @@ Example program:
pr.set_target_fps(60) pr.set_target_fps(60)
camera = pr.Camera3D([18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0) camera = pr.Camera3D([18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0)
pr.set_camera_mode(camera, pr.CAMERA_ORBITAL)
while not pr.window_should_close(): while not pr.window_should_close():
pr.update_camera(camera, pr.CAMERA_ORBITAL) pr.update_camera(camera)
pr.begin_drawing() pr.begin_drawing()
pr.clear_background(pr.RAYWHITE) pr.clear_background(pr.RAYWHITE)
pr.begin_mode_3d(camera) pr.begin_mode_3d(camera)
@ -56,9 +45,9 @@ Example program:
init_window(800, 450, "Raylib texture test") init_window(800, 450, "Raylib texture test")
... ...
You don't need to use the PyRay() class anymore.
`See all examples here <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_ See also https://github.com/electronstudio/raylib-python-cffi/blob/master/tests/test_pyray.py
API reference API reference
------------- -------------

View file

@ -1,8 +1,7 @@
C API C API
============= =============
The goal of the C API is make usage as similar to the original C as CFFI will allow. The goal of the C API is make usage as similar to the original C as CFFI will allow. The `example programs <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
So the `example programs <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
are very, very similar to the C originals. are very, very similar to the C originals.
Example program: Example program:
@ -15,9 +14,10 @@ Example program:
SetTargetFPS(60) SetTargetFPS(60)
camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0]) camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0])
SetCameraMode(camera[0], CAMERA_ORBITAL)
while not WindowShouldClose(): while not WindowShouldClose():
UpdateCamera(camera, CAMERA_ORBITAL) UpdateCamera(camera)
BeginDrawing() BeginDrawing()
ClearBackground(RAYWHITE) ClearBackground(RAYWHITE)
BeginMode3D(camera[0]) BeginMode3D(camera[0])
@ -39,16 +39,11 @@ If you want to be more portable (i.e. same code will work with dynamic bindings)
... ...
See also https://github.com/electronstudio/raylib-python-cffi/blob/master/tests/test_static.py
.. note:: Whenever you need to convert stuff between C and Python see https://cffi.readthedocs.io .. note:: Whenever you need to convert stuff between C and Python see https://cffi.readthedocs.io
.. important:: Your **primary reference** should always be .. important:: Your **primary reference** should always be `the official Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib examples <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
* `the C Raylib header file <https://github.com/raysan5/raylib/blob/master/src/raylib.h>`_
However, here is a list of available functions: However, here is a list of available functions:

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1 # Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: f2032a6434b52f7c68551d0ad70d555b config: 76ca504c87a97062e6f8d0973741212b
tags: 645f666f9bcd5a90fca523b33c5a78b7 tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -1,26 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Building from source &mdash; Raylib Python documentation</title> <title>Building from source &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" /> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/jquery.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Raspberry Pi" href="RPI.html" />
<link rel="prev" title="Dynamic Bindings" href="dynamic.html" /> <link rel="prev" title="Dynamic Bindings" href="dynamic.html" />
</head> </head>
@ -29,32 +24,26 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Raylib Python
<a href="index.html" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -67,11 +56,11 @@
<li class="toctree-l3"><a class="reference internal" href="#windows-manual-build">Windows manual build</a></li> <li class="toctree-l3"><a class="reference internal" href="#windows-manual-build">Windows manual build</a></li>
<li class="toctree-l3"><a class="reference internal" href="#linux-manual-build">Linux manual build</a></li> <li class="toctree-l3"><a class="reference internal" href="#linux-manual-build">Linux manual build</a></li>
<li class="toctree-l3"><a class="reference internal" href="#macos-manual-build">Macos manual build</a></li> <li class="toctree-l3"><a class="reference internal" href="#macos-manual-build">Macos manual build</a></li>
<li class="toctree-l3"><a class="reference internal" href="#raspberry-pi">Raspberry Pi</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -87,8 +76,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Building from source</li> <li>Building from source</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/BUILDING.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/BUILDING.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
@ -98,29 +87,28 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="building-from-source"> <div class="section" id="building-from-source">
<h1>Building from source<a class="headerlink" href="#building-from-source" title="Link to this heading"></a></h1> <h1>Building from source<a class="headerlink" href="#building-from-source" title="Permalink to this headline"></a></h1>
<section id="have-pip-build-from-source"> <div class="section" id="have-pip-build-from-source">
<h2>Have Pip build from source<a class="headerlink" href="#have-pip-build-from-source" title="Link to this heading"></a></h2> <h2>Have Pip build from source<a class="headerlink" href="#have-pip-build-from-source" title="Permalink to this headline"></a></h2>
<p>This is useful if the binaries dont work on your system, or you want to use a newer version of Raylib.</p> <p>This is useful if the binaries dont work on your system, or you want to use a newer version of Raylib.</p>
<p>First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this <p>First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this
is to compile and install Raylib using CMake: <a class="reference external" href="https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake">https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake</a></p> is to compile and install Raylib using CMake: <a class="reference external" href="https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake">https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake</a></p>
<p>Requirements for build: cmake, pkg-config.</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">raylib</span><span class="o">-</span><span class="mf">4.0</span><span class="o">.</span><span class="mi">0</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">raylib</span><span class="o">-</span><span class="mf">5.0</span>
<span class="n">mkdir</span> <span class="n">build</span> <span class="n">mkdir</span> <span class="n">build</span>
<span class="n">cd</span> <span class="n">build</span> <span class="n">cd</span> <span class="n">build</span>
<span class="n">cmake</span> <span class="o">-</span><span class="n">DCUSTOMIZE_BUILD</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_JPG</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_FLAC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DWITH_PIC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">..</span> <span class="n">cmake</span> <span class="o">-</span><span class="n">DWITH_PIC</span><span class="o">=</span><span class="n">on</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">..</span>
<span class="n">make</span> <span class="n">make</span>
<span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span> <span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span>
</pre></div> </pre></div>
</div> </div>
<p>Then ask Pip to build from source:</p> <p>Then ask Pip to build from source:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="o">-</span><span class="nb">dir</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="n">raylib</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="n">raylib</span>
</pre></div> </pre></div>
</div> </div>
</section> </div>
<section id="or-build-from-source-manually"> <div class="section" id="or-build-from-source-manually">
<h2>Or, Build from source manually<a class="headerlink" href="#or-build-from-source-manually" title="Link to this heading"></a></h2> <h2>Or, Build from source manually<a class="headerlink" href="#or-build-from-source-manually" title="Permalink to this headline"></a></h2>
<p>Useful if the Pip build doesnt work and you want to debug it, or you want to contribute to the <p>Useful if the Pip build doesnt work and you want to debug it, or you want to contribute to the
project.</p> project.</p>
<div class="admonition attention"> <div class="admonition attention">
@ -128,10 +116,10 @@ project.</p>
<p>If the Pip build doesnt work, please submit a bug. (And if you have <p>If the Pip build doesnt work, please submit a bug. (And if you have
fixed it, a PR.)</p> fixed it, a PR.)</p>
</div> </div>
<p>Manual instructions follow, but are probably outdated, so see instead how we actually build the wheels <p>Manual instructions follow, but may be outdated, so see also how we actually build the wheels
at <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml">https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml</a></p> at <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml">https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml</a></p>
<section id="windows-manual-build"> <div class="section" id="windows-manual-build">
<h3>Windows manual build<a class="headerlink" href="#windows-manual-build" title="Link to this heading"></a></h3> <h3>Windows manual build<a class="headerlink" href="#windows-manual-build" title="Permalink to this headline"></a></h3>
<p>Clone this repo including submodules so you get correct version of <p>Clone this repo including submodules so you get correct version of
Raylib.</p> Raylib.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="o">--</span><span class="n">recurse</span><span class="o">-</span><span class="n">submodules</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">electronstudio</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="o">--</span><span class="n">recurse</span><span class="o">-</span><span class="n">submodules</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">electronstudio</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span>
@ -166,14 +154,14 @@ Raylib.</p>
Would be useful if some Windows user could figure out how to auto detect this.</p> Would be useful if some Windows user could figure out how to auto detect this.</p>
</div> </div>
<p>Then install it:</p> <p>Then install it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">dist</span>\<span class="n">raylib</span><span class="o">-</span><span class="mf">3.7.0</span><span class="o">-</span><span class="n">cp37</span><span class="o">-</span><span class="n">cp37m</span><span class="o">-</span><span class="n">win_amd64</span><span class="o">.</span><span class="n">whl</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">dist</span>\<span class="n">raylib</span><span class="o">-</span><span class="mf">3.7</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="n">cp37</span><span class="o">-</span><span class="n">cp37m</span><span class="o">-</span><span class="n">win_amd64</span><span class="o">.</span><span class="n">whl</span>
</pre></div> </pre></div>
</div> </div>
<p>(Note: your wheels filename will probably be different than the one <p>(Note: your wheels filename will probably be different than the one
here.)</p> here.)</p>
</section> </div>
<section id="linux-manual-build"> <div class="section" id="linux-manual-build">
<h3>Linux manual build<a class="headerlink" href="#linux-manual-build" title="Link to this heading"></a></h3> <h3>Linux manual build<a class="headerlink" href="#linux-manual-build" title="Permalink to this headline"></a></h3>
<p>Clone this repo including submodules so you get correct version of <p>Clone this repo including submodules so you get correct version of
Raylib.</p> Raylib.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="o">--</span><span class="n">recurse</span><span class="o">-</span><span class="n">submodules</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">electronstudio</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="o">--</span><span class="n">recurse</span><span class="o">-</span><span class="n">submodules</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">electronstudio</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span>
@ -185,11 +173,11 @@ Raylib.</p>
<p>You can instead use a different version of Raylib you installed from elsewhere, and it should still <p>You can instead use a different version of Raylib you installed from elsewhere, and it should still
work!</p> work!</p>
</div> </div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="n">cmake</span> <span class="n">libasound2</span><span class="o">-</span><span class="n">dev</span> <span class="n">mesa</span><span class="o">-</span><span class="n">common</span><span class="o">-</span><span class="n">dev</span> <span class="n">libx11</span><span class="o">-</span><span class="n">dev</span> <span class="n">libxrandr</span><span class="o">-</span><span class="n">dev</span> <span class="n">libxi</span><span class="o">-</span><span class="n">dev</span> <span class="n">xorg</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgl1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libglu1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">pkg</span><span class="o">-</span><span class="n">config</span> <span class="n">cmake</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="n">cmake</span> <span class="n">libasound2</span><span class="o">-</span><span class="n">dev</span> <span class="n">mesa</span><span class="o">-</span><span class="n">common</span><span class="o">-</span><span class="n">dev</span> <span class="n">libx11</span><span class="o">-</span><span class="n">dev</span> <span class="n">libxrandr</span><span class="o">-</span><span class="n">dev</span> <span class="n">libxi</span><span class="o">-</span><span class="n">dev</span> <span class="n">xorg</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgl1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libglu1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span>
<span class="n">cd</span> <span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">c</span> <span class="n">cd</span> <span class="n">raylib</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">cffi</span><span class="o">/</span><span class="n">raylib</span><span class="o">-</span><span class="n">c</span>
<span class="n">mkdir</span> <span class="n">build</span> <span class="n">mkdir</span> <span class="n">build</span>
<span class="n">cd</span> <span class="n">build</span> <span class="n">cd</span> <span class="n">build</span>
<span class="n">cmake</span> <span class="o">-</span><span class="n">DCUSTOMIZE_BUILD</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_JPG</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_FLAC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DWITH_PIC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">..</span> <span class="n">cmake</span> <span class="o">-</span><span class="n">DWITH_PIC</span><span class="o">=</span><span class="n">on</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">..</span>
<span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span> <span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span>
</pre></div> </pre></div>
</div> </div>
@ -207,7 +195,7 @@ work!</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">../..</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">../..</span>
</pre></div> </pre></div>
</div> </div>
<p>Build the Python library:</p> <p>Build</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">cffi</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">cffi</span>
<span class="n">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="n">build</span> <span class="n">raylib</span><span class="o">/</span><span class="n">_raylib_cffi</span><span class="o">.*</span> <span class="n">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="n">build</span> <span class="n">raylib</span><span class="o">/</span><span class="n">_raylib_cffi</span><span class="o">.*</span>
<span class="n">python3</span> <span class="n">raylib</span><span class="o">/</span><span class="n">build</span><span class="o">.</span><span class="n">py</span> <span class="n">python3</span> <span class="n">raylib</span><span class="o">/</span><span class="n">build</span><span class="o">.</span><span class="n">py</span>
@ -245,9 +233,9 @@ work!</p>
<p>Separate the instructions for preparing the dynamic module <p>Separate the instructions for preparing the dynamic module
from the instructions for building the static module!</p> from the instructions for building the static module!</p>
</div> </div>
</section> </div>
<section id="macos-manual-build"> <div class="section" id="macos-manual-build">
<h3>Macos manual build<a class="headerlink" href="#macos-manual-build" title="Link to this heading"></a></h3> <h3>Macos manual build<a class="headerlink" href="#macos-manual-build" title="Permalink to this headline"></a></h3>
<p>These instructions have been tested on Macos 10.14.</p> <p>These instructions have been tested on Macos 10.14.</p>
<p>Clone this repo including submodules so you get correct version of <p>Clone this repo including submodules so you get correct version of
Raylib.</p> Raylib.</p>
@ -272,16 +260,44 @@ Raylib.</p>
<span class="n">python3</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">install</span> <span class="n">python3</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">install</span>
</pre></div> </pre></div>
</div> </div>
</section> </div>
</section> <div class="section" id="raspberry-pi">
</section> <h3>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Permalink to this headline"></a></h3>
<p>Latest info: <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues/55#issuecomment-1012629701">https://github.com/electronstudio/raylib-python-cffi/issues/55#issuecomment-1012629701</a></p>
<p>Old possibly out of date info that was written for RPi3 and Raylib 3 follows.</p>
<p>The integrated GPU hardware in a Raspberry Pi (“VideoCore”) is rather
idiosyncratic, resulting in a complex set of software options. Probably
the most interesting two options for Raylib applications are:</p>
<ol class="arabic simple">
<li><p>Use the Broadcom proprietary Open GL ES 2.0 drivers, installed by
Raspbian into <code class="docutils literal notranslate"><span class="pre">/opt/vc</span></code>. These are 32-bit only, and currently X11
doesnt use these for its acceleration, so this is most suitable for
driving the entire HDMI output from one application with minimal
overhead (no X11).</p></li>
<li><p>Use the more recent open-source <code class="docutils literal notranslate"><span class="pre">vc4-fkms-v3d</span></code> kernel driver. This
can run in either 32-bit or 64-bit, and X11 can use these, so using
X11 is probably the more common choice here.</p></li>
</ol>
<p>With option 2, the regular linux install instructions above should
probably work as-is.</p>
<p>For option 1, then also follow the above instructions, but with these
modifications:</p>
<ul class="simple">
<li><p>With <code class="docutils literal notranslate"><span class="pre">cmake</span></code>, use
<code class="docutils literal notranslate"><span class="pre">cmake</span> <span class="pre">-DWITH_PIC=on</span> <span class="pre">-DSTATIC=on</span> <span class="pre">-DSHARED=on</span> <span class="pre">-DPLATFORM='Raspberry</span> <span class="pre">Pi'</span> <span class="pre">..</span></code></p></li>
</ul>
<p>(See
<a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues/31#issuecomment-862078330">here</a>
for a Raspberry Pi wheel)</p>
</div>
</div>
</div>
</div> </div>
</div> </div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="dynamic.html" class="btn btn-neutral float-left" title="Dynamic Bindings" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="dynamic.html" class="btn btn-neutral float-left" title="Dynamic Bindings" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="RPI.html" class="btn btn-neutral float-right" title="Raspberry Pi" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div> </div>
<hr/> <hr/>

View file

@ -1,22 +1,18 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python Bindings for Raylib 5.5 &mdash; Raylib Python documentation</title> <title>Python Bindings for Raylib 4.0.0 &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" /> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/jquery.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
@ -29,53 +25,34 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Raylib Python
<a href="index.html" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Python Bindings for Raylib 5.5</a><ul> <li class="toctree-l1 current"><a class="current reference internal" href="#">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l2"><a class="reference internal" href="#libraries-raymath-raygui-rlgl-physac-and-glfw">Libraries: raymath, raygui, rlgl, physac and GLFW</a></li>
<li class="toctree-l2"><a class="reference internal" href="#backends-desktop-sdl-drm-web">Backends: Desktop, SDL, DRM, Web</a></li>
<li class="toctree-l2"><a class="reference internal" href="#platforms-windows-mac-linux-raspberry-pi-web">Platforms: Windows, Mac, Linux, Raspberry Pi, Web</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="#installation">Installation</a><ul> <li class="toctree-l1"><a class="reference internal" href="#installation">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#windows">Windows</a></li>
<li class="toctree-l2"><a class="reference internal" href="#macos">MacOS</a></li>
<li class="toctree-l2"><a class="reference internal" href="#linux">Linux</a></li>
<li class="toctree-l2"><a class="reference internal" href="#raspberry-pi">Raspberry Pi</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="#backends">Backends</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#dynamic-binding-version">Dynamic binding version</a></li> <li class="toctree-l2"><a class="reference internal" href="#dynamic-binding-version">Dynamic binding version</a></li>
<li class="toctree-l2"><a class="reference internal" href="#sdl-backend">SDL backend</a></li> <li class="toctree-l2"><a class="reference internal" href="#beta-testing">Beta testing</a></li>
<li class="toctree-l2"><a class="reference internal" href="#drm-backend">DRM backend</a></li>
<li class="toctree-l2"><a class="reference internal" href="#problems">Problems?</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l1"><a class="reference internal" href="#how-to-use">How to use</a><ul> <li class="toctree-l1"><a class="reference internal" href="#how-to-use">How to use</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api">If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API</a></li> <li class="toctree-l2"><a class="reference internal" href="#if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api">If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API</a></li>
<li class="toctree-l2"><a class="reference internal" href="#if-you-prefer-a-more-pythonistic-api">If you prefer a more Pythonistic API</a></li> <li class="toctree-l2"><a class="reference internal" href="#if-you-prefer-a-slightly-more-pythonistic-api-and-don-t-mind-it-might-be-slightly-slower">If you prefer a slightly more Pythonistic API and dont mind it might be slightly slower</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l1"><a class="reference internal" href="#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="#performance">Performance</a><ul> <li class="toctree-l1"><a class="reference internal" href="#performance">Performance</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#bunnymark">Bunnymark</a></li> <li class="toctree-l2"><a class="reference internal" href="#bunnymark">Bunnymark</a></li>
</ul> </ul>
@ -86,7 +63,6 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li> <li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -102,8 +78,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Python Bindings for Raylib 5.5</li> <li>Python Bindings for Raylib 4.0.0</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/README.md.txt" rel="nofollow"> View page source</a> <a href="_sources/README.md.txt" rel="nofollow"> View page source</a>
</li> </li>
@ -113,239 +89,106 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="python-bindings-for-raylib-5-5"> <div class="tex2jax_ignore mathjax_ignore section" id="python-bindings-for-raylib-4-0-0">
<h1>Python Bindings for Raylib 5.5<a class="headerlink" href="#python-bindings-for-raylib-5-5" title="Link to this heading"></a></h1> <h1>Python Bindings for Raylib 4.0.0<a class="headerlink" href="#python-bindings-for-raylib-4-0-0" title="Permalink to this headline"></a></h1>
<section id="libraries-raymath-raygui-rlgl-physac-and-glfw"> <p>New CFFI API static bindings.</p>
<h2>Libraries: raymath, raygui, rlgl, physac and GLFW<a class="headerlink" href="#libraries-raymath-raygui-rlgl-physac-and-glfw" title="Link to this heading"></a></h2>
</section>
<section id="backends-desktop-sdl-drm-web">
<h2>Backends: Desktop, SDL, DRM, Web<a class="headerlink" href="#backends-desktop-sdl-drm-web" title="Link to this heading"></a></h2>
</section>
<section id="platforms-windows-mac-linux-raspberry-pi-web">
<h2>Platforms: Windows, Mac, Linux, Raspberry Pi, Web<a class="headerlink" href="#platforms-windows-mac-linux-raspberry-pi-web" title="Link to this heading"></a></h2>
<p><img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dm/raylib" /></p>
<p>Chatroom: <a class="reference external" href="https://discord.gg/fKDwt85aX6">Discord</a></p>
<p>HELP WANTED: <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues/155">writing examples</a></p>
<p>Features:</p>
<ul class="simple"> <ul class="simple">
<li><p>CFFI API static bindings.</p></li>
<li><p>Automatically generated to be as close as possible to <li><p>Automatically generated to be as close as possible to
original Raylib.</p></li> original Raylib.</p></li>
<li><p>Faster, fewer bugs and easier to maintain than ctypes.</p></li> <li><p>Faster, fewer bugs and easier to maintain than ctypes.</p></li>
<li><p>Commercial-friendly license.</p></li> <li><p>Commercial-friendly license.</p></li>
<li><p>Docstrings and auto-completion.</p></li> <li><p>Docstrings and auto-completion.</p></li>
<li><p>Type checking with Mypy</p></li> <li><p><strong>Now includes extra libraries: raygui, rlgl and physac</strong></p></li>
</ul> </ul>
<p><a class="reference external" href="http://electronstudio.github.io/raylib-python-cffi">Full documentation</a></p> <p><a class="reference external" href="http://electronstudio.github.io/raylib-python-cffi">Full documentation</a></p>
</section> </div>
</section> <div class="tex2jax_ignore mathjax_ignore section" id="quickstart">
<section id="quickstart"> <h1>Quickstart<a class="headerlink" href="#quickstart" title="Permalink to this headline"></a></h1>
<h1>Quickstart<a class="headerlink" href="#quickstart" title="Link to this heading"></a></h1> <p><code class="docutils literal notranslate"><span class="pre">pip3</span> <span class="pre">install</span> <span class="pre">raylib</span></code></p>
<p><code class="docutils literal notranslate"><span class="pre">pip3</span> <span class="pre">install</span> <span class="pre">raylib==5.5.0.2</span> <span class="pre">--break-system-packages</span></code></p> <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>from pyray import *
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">pyray</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span> init_window(800, 450, &quot;Hello&quot;)
<span class="n">init_window</span><span class="p">(</span><span class="mi">800</span><span class="p">,</span> <span class="mi">450</span><span class="p">,</span> <span class="s2">&quot;Hello&quot;</span><span class="p">)</span> while not window_should_close():
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span> begin_drawing()
<span class="n">begin_drawing</span><span class="p">()</span> clear_background(WHITE)
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span> draw_text(&quot;Hello world&quot;, 190, 200, 20, VIOLET)
<span class="n">draw_text</span><span class="p">(</span><span class="s2">&quot;Hello world&quot;</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="n">VIOLET</span><span class="p">)</span> end_drawing()
<span class="n">end_drawing</span><span class="p">()</span> close_window()
<span class="n">close_window</span><span class="p">()</span>
</pre></div> </pre></div>
</div> </div>
</section>
<section id="installation">
<h1>Installation<a class="headerlink" href="#installation" title="Link to this heading"></a></h1>
<p>If you are on a modern Linux you will probably want to create a venv:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m venv venv
source venv/bin/activate
</pre></div>
</div> </div>
<p>Then make sure you have the latest pip installed:</p> <div class="tex2jax_ignore mathjax_ignore section" id="installation">
<h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline"></a></h1>
<p>First make sure you have the latest pip installed:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install --upgrade pip <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install --upgrade pip
</pre></div> </pre></div>
</div> </div>
<p>Then install</p> <p>Then install</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install setuptools <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib
python3 -m pip install raylib==5.5.0.2
</pre></div> </pre></div>
</div> </div>
<p>On most platforms it should install a binary wheel. If yours isnt available then pip will attempt to build from <p>On most platforms it should install a binary wheel (Windows 10 x64, MacOS 10.15 x64, Linux Ubuntu1804 x64).</p>
source, in which case you will need to have Raylib development libs installed, e.g. <p>If yours isnt available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g.
using homebrew, apt, etc.</p> using homebrew, apt, etc.</p>
<section id="windows"> <p><a class="reference internal" href="BUILDING.html"><span class="doc std std-doc">If it doesnt work, you can build manually.</span></a></p>
<h2>Windows<a class="headerlink" href="#windows" title="Link to this heading"></a></h2> <div class="section" id="dynamic-binding-version">
<p>Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)</p> <h2>Dynamic binding version<a class="headerlink" href="#dynamic-binding-version" title="Permalink to this headline"></a></h2>
<p>Use an <a class="reference external" href="https://www.python.org/downloads/windows/">official Windows Python release</a> rather than WSL, MSYS, etc.</p>
</section>
<section id="macos">
<h2>MacOS<a class="headerlink" href="#macos" title="Link to this heading"></a></h2>
<p>Binaries require:</p>
<ul class="simple">
<li><p>arm64 MacOS 14</p></li>
<li><p>x64 MacOS 10.13, or newer.</p></li>
</ul>
<p>Older MacOS requires building from source but this is usually simple:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>brew install pkg-config
brew install raylib
python3 -m pip install raylib==5.5.0.2
</pre></div>
</div>
<p>(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue
if you want to test them.)</p>
</section>
<section id="linux">
<h2>Linux<a class="headerlink" href="#linux" title="Link to this heading"></a></h2>
<p>Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source.
(Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)</p>
<p>The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0
so may not work on other boards.</p>
</section>
<section id="raspberry-pi">
<h2>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Link to this heading"></a></h2>
<p><span class="xref myst">Using on Rasperry Pi</span></p>
</section>
</section>
<section id="backends">
<h1>Backends<a class="headerlink" href="#backends" title="Link to this heading"></a></h1>
<section id="dynamic-binding-version">
<h2>Dynamic binding version<a class="headerlink" href="#dynamic-binding-version" title="Link to this heading"></a></h2>
<p>There is now a separate dynamic version of this binding:</p> <p>There is now a separate dynamic version of this binding:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib_dynamic
python3 -m pip install raylib_dynamic
</pre></div> </pre></div>
</div> </div>
<p>It works on some systems where the static version doesnt, <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/dynamic.html">but be sure to read these caveats before using it</a></p> <p><a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/dynamic.html">Read this before using raylib_dynamic</a></p>
<p>You cant have multiple raylib packages installed at once.</p> </div>
</section> <div class="section" id="beta-testing">
<section id="sdl-backend"> <h2>Beta testing<a class="headerlink" href="#beta-testing" title="Permalink to this headline"></a></h2>
<h2>SDL backend<a class="headerlink" href="#sdl-backend" title="Link to this heading"></a></h2> <p>You can install an alpha or beta version by specifying the exact version number like this:</p>
<p>This is not well tested but has better support for controllers:</p> <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib==4.0a6
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib
python3 -m pip install raylib_sdl
</pre></div> </pre></div>
</div> </div>
<p>You cant have multiple raylib packages installed at once.</p>
</section>
<section id="drm-backend">
<h2>DRM backend<a class="headerlink" href="#drm-backend" title="Link to this heading"></a></h2>
<p>This uses the Linux framebuffer for devices that dont run X11/Wayland:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib
python3 -m pip install raylib_drm
</pre></div>
</div> </div>
<p>You cant have multiple raylib packages installed at once.</p>
</section>
<section id="problems">
<h2>Problems?<a class="headerlink" href="#problems" title="Link to this heading"></a></h2>
<p>If it doesnt work, <span class="xref myst">try to build manually.</span>. If that works then <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues">submit an issue</a>
to let us know what you did.</p>
<p>If you need help you can try asking on <a class="reference external" href="https://discord.gg/fKDwt85aX6">our discord</a>. There is also a large <a class="reference external" href="https://discord.gg/raylib">Raylib discord</a>
for issues that are not Python-specific.</p>
<p>If it still doesnt work, <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues">submit an issue</a>.</p>
</section>
</section>
<section id="how-to-use">
<h1>How to use<a class="headerlink" href="#how-to-use" title="Link to this heading"></a></h1>
<p>There are <em>two</em> modules in the raylib package, <code class="docutils literal notranslate"><span class="pre">raylib</span></code> and <code class="docutils literal notranslate"><span class="pre">pyray</span></code>. (There is no separate package for
pyray. Do <em>not</em> <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pyray</span></code>). You can use either or both:</p>
<section id="if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api">
<h2>If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API<a class="headerlink" href="#if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api" title="Link to this heading"></a></h2>
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/raylib.html">the raylib module</a>.</p>
</section>
<section id="if-you-prefer-a-more-pythonistic-api">
<h2>If you prefer a more Pythonistic API<a class="headerlink" href="#if-you-prefer-a-more-pythonistic-api" title="Link to this heading"></a></h2>
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/pyray.html">the pyray module</a>.</p>
</section>
</section>
<section id="running-in-a-web-browser">
<h1>Running in a web browser<a class="headerlink" href="#running-in-a-web-browser" title="Link to this heading"></a></h1>
<p><a class="reference external" href="https://pypi.org/project/pygbag/">Pygbag</a> &gt;=0.8.7 supports running in a web browser. Usually the latest git version
is recommended.</p>
<p>Make a folder <code class="docutils literal notranslate"><span class="pre">my_project</span></code> with a file <code class="docutils literal notranslate"><span class="pre">main.py</span></code>:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># /// script</span>
<span class="c1"># dependencies = [</span>
<span class="c1"># &quot;cffi&quot;,</span>
<span class="c1"># &quot;raylib&quot;</span>
<span class="c1"># ]</span>
<span class="c1"># ///</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">platform</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pyray</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">():</span> <span class="c1"># You MUST have an async main function</span>
<span class="n">init_window</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="s2">&quot;Hello&quot;</span><span class="p">)</span>
<span class="n">platform</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">window_resize</span><span class="p">()</span> <span class="c1"># You MAY want to add this line</span>
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span>
<span class="n">begin_drawing</span><span class="p">()</span>
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span>
<span class="n">draw_text</span><span class="p">(</span><span class="s2">&quot;Hello world&quot;</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="n">VIOLET</span><span class="p">)</span>
<span class="n">end_drawing</span><span class="p">()</span>
<span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># You MUST call this in your main loop</span>
<span class="n">close_window</span><span class="p">()</span>
<span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
</pre></div>
</div> </div>
<p>Then to create the web files and launch a web server:</p> <div class="tex2jax_ignore mathjax_ignore section" id="how-to-use">
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3.12 -m pip install --user --upgrade pygbag <h1>How to use<a class="headerlink" href="#how-to-use" title="Permalink to this headline"></a></h1>
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project <p>There are two APIs, you can use either or both:</p>
</pre></div> <div class="section" id="if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api">
<h2>If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API<a class="headerlink" href="#if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api" title="Permalink to this headline"></a></h2>
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/raylib.html">the C API</a>.</p>
</div> </div>
<p>Point your browser to http://localhost:8000</p> <div class="section" id="if-you-prefer-a-slightly-more-pythonistic-api-and-don-t-mind-it-might-be-slightly-slower">
<p>Some features may not work, so you can disable them like this:</p> <h2>If you prefer a slightly more Pythonistic API and dont mind it might be slightly slower<a class="headerlink" href="#if-you-prefer-a-slightly-more-pythonistic-api-and-don-t-mind-it-might-be-slightly-slower" title="Permalink to this headline"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&quot;Emscripten&quot;</span><span class="p">:</span> <span class="c1"># audio may not work on current version of emscripten</span> <p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/pyray.html">the Python API</a>.</p>
<span class="n">init_audio_device</span><span class="p">()</span>
</pre></div>
</div> </div>
<p>This is all done by Pygbag rather than by me, so you should probably contact them with any issues. </div>
Carefully read all their <a class="reference external" href="https://pygame-web.github.io/">documentation</a>.</p> <div class="tex2jax_ignore mathjax_ignore section" id="app-showcase">
<p>It does work for most of <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/">these examples</a></p> <h1>App showcase<a class="headerlink" href="#app-showcase" title="Permalink to this headline"></a></h1>
</section>
<section id="app-showcase">
<h1>App showcase<a class="headerlink" href="#app-showcase" title="Link to this heading"></a></h1>
<p><a class="reference external" href="https://github.com/Emtyloc/tempest-raylib">Tempest-raylib</a></p>
<p><a class="reference external" href="https://github.com/bilbofroggins/KarabinerKeyboard">KarabinerKeyboard</a></p>
<p><a class="reference external" href="https://github.com/Yonokid/PyTaiko">PyTaiko</a></p>
<p><a class="reference external" href="https://github.com/StanislavPetrovV/DOOM-Clone">DOOM-Clone</a></p>
<p><a class="reference external" href="https://github.com/pkulev/tanki">Tanki</a></p> <p><a class="reference external" href="https://github.com/pkulev/tanki">Tanki</a></p>
<p><a class="reference external" href="https://pebaz.itch.io/alloy-bloxel-editor">Alloy Bloxel Editor</a></p>
<p><a class="reference external" href="https://github.com/Miou-zora/Eidolon">Eidolon</a></p>
<p>Add your app here!</p> <p>Add your app here!</p>
</section> </div>
<section id="rlzero"> <div class="tex2jax_ignore mathjax_ignore section" id="rlzero">
<h1>RLZero<a class="headerlink" href="#rlzero" title="Link to this heading"></a></h1> <h1>RLZero<a class="headerlink" href="#rlzero" title="Permalink to this headline"></a></h1>
<p>A related library (that is a work in progress!):</p> <p>A related library (that is a work in progress!):</p>
<p><a class="reference external" href="https://github.com/electronstudio/rlzero">A simplified API for Raylib for use in education and to enable beginners to create 3d games</a></p> <p><a class="reference external" href="https://github.com/electronstudio/rlzero">A simplified API for Raylib for use in education and to enable beginners to create 3d games</a></p>
</section> </div>
<section id="help-wanted"> <div class="tex2jax_ignore mathjax_ignore section" id="help-wanted">
<h1>Help wanted<a class="headerlink" href="#help-wanted" title="Link to this heading"></a></h1> <h1>Help wanted<a class="headerlink" href="#help-wanted" title="Permalink to this headline"></a></h1>
<ul class="simple"> <ul class="simple">
<li><p>Converting more examples from C to Python</p></li> <li><p>Converting more examples from C to Python</p></li>
<li><p>Testing on more platforms</p></li> <li><p>Testing on more platforms</p></li>
</ul> </ul>
</section> </div>
<section id="license"> <div class="tex2jax_ignore mathjax_ignore section" id="license-updated">
<h1>License<a class="headerlink" href="#license" title="Link to this heading"></a></h1> <h1>License (updated)<a class="headerlink" href="#license-updated" title="Permalink to this headline"></a></h1>
<p>Eclipse Public License, so you are free to <p>The bindings are now under the Eclipse Public License, so you are free to
statically link and use in non-free / proprietary / commercial projects!</p> statically link and use in non-free / proprietary / commercial projects!</p>
</section> </div>
<section id="performance"> <div class="tex2jax_ignore mathjax_ignore section" id="performance">
<h1>Performance<a class="headerlink" href="#performance" title="Link to this heading"></a></h1> <h1>Performance<a class="headerlink" href="#performance" title="Permalink to this headline"></a></h1>
<p>If you need more performance, do in this order:</p> <p>For fastest performance use Pypy rather than standard Python.</p>
<ol class="arabic simple"> <p>Every call to C is costly, so its slightly faster if you use Python data structures and functions when calculating
<li><p>Use Pypy rather than standard CPython. It is much, much faster and will make more difference than any other optimisations you might do.</p></li>
<li><p>Every call to C is costly, so its slightly faster if you use Python data structures and functions when calculating
in your update loop in your update loop
and then only convert them to C data structures when you have to call the C functions for drawing.</p></li> and then only convert them to C data structures when you have to call the C functions for drawing.</p>
<li><p>The raylib.* functions are potentially <em>slightly</em> faster than the pyray.* equivalents, so if you need a tiny bit more performance <div class="section" id="bunnymark">
you can switch your inner loop functions to these.</p></li> <h2>Bunnymark<a class="headerlink" href="#bunnymark" title="Permalink to this headline"></a></h2>
<li><p>There is a version of Python that is faster than Pypy: GraalPy. However its not fully compatible with all Python <table class="colwidths-auto docutils align-default">
packages. It doesnt work with CFFI and so doesnt work with this binding. But it <em>is</em> compatible with the
<em>Java</em> binding, Jaylib! There is an example of this here: https://github.com/electronstudio/megabunny/tree/master/raylib-python-jaylib</p></li>
</ol>
<section id="bunnymark">
<h2>Bunnymark<a class="headerlink" href="#bunnymark" title="Link to this heading"></a></h2>
<table class="docutils align-default">
<thead> <thead>
<tr class="row-odd"><th class="head"><p>Library</p></th> <tr class="row-odd"><th class="head"><p>Library</p></th>
<th class="head"><p>Implementation</p></th> <th class="head"><p>Implementation</p></th>
@ -354,66 +197,50 @@ packages. It doesnt work with CFFI and so doesnt work with this binding.
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="row-even"><td><p>Raylib 5.0</p></td> <tr class="row-even"><td><p>Raylib 3.7</p></td>
<td><p>C</p></td>
<td><p>180000</p></td>
<td><p>100%</p></td>
</tr>
<tr class="row-odd"><td><p>Raylib Python CFFI 5.0.0.2</p></td>
<td><p>Python 3.12</p></td>
<td><p>10500</p></td>
<td><p>5.8%</p></td>
</tr>
<tr class="row-even"><td><p>Raylib Python CFFI 5.0.0.2</p></td>
<td><p>Pypy 3.10</p></td>
<td><p>95000</p></td>
<td><p>53%</p></td>
</tr>
<tr class="row-odd"><td><p>Raylib 3.7</p></td>
<td><p>C</p></td> <td><p>C</p></td>
<td><p>168100</p></td> <td><p>168100</p></td>
<td><p>100%</p></td> <td><p>100%</p></td>
</tr> </tr>
<tr class="row-even"><td><p>Raylib Python CFFI 3.7</p></td> <tr class="row-odd"><td><p>Raylib Python CFFI 3.7</p></td>
<td><p>Pypy 3.7</p></td> <td><p>Pypy 3.7</p></td>
<td><p>33800</p></td> <td><p>33800</p></td>
<td><p>20%</p></td> <td><p>20%</p></td>
</tr> </tr>
<tr class="row-odd"><td><p>Raylib Python CFFI 3.7</p></td> <tr class="row-even"><td><p>Raylib Python CFFI 3.7</p></td>
<td><p>Python 3.9</p></td> <td><p>Python 3.9</p></td>
<td><p>7700</p></td> <td><p>7700</p></td>
<td><p>4.5%</p></td> <td><p>4.5%</p></td>
</tr> </tr>
<tr class="row-even"><td><p>Raylib Python CFFI 3.7</p></td> <tr class="row-odd"><td><p>Raylib Python CFFI 3.7</p></td>
<td><p>Python 3.9 Nuitka</p></td> <td><p>Python 3.9 Nuitka</p></td>
<td><p>8600</p></td> <td><p>8600</p></td>
<td><p>5.1%</p></td> <td><p>5.1%</p></td>
</tr> </tr>
<tr class="row-odd"><td><p>Raylib Python CFFI 3.7 Dynamic</p></td> <tr class="row-even"><td><p>Raylib Python CFFI 3.7 Dynamic</p></td>
<td><p>Python 3.9</p></td> <td><p>Python 3.9</p></td>
<td><p>6300</p></td> <td><p>6300</p></td>
<td><p>3.7%</p></td> <td><p>3.7%</p></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p>See also https://github.com/electronstudio/megabunny/</p> </div>
</section> </div>
</section> <div class="tex2jax_ignore mathjax_ignore section" id="packaging-your-app">
<section id="packaging-your-app"> <h1>Packaging your app<a class="headerlink" href="#packaging-your-app" title="Permalink to this headline"></a></h1>
<h1>Packaging your app<a class="headerlink" href="#packaging-your-app" title="Link to this heading"></a></h1>
<p>You can create a standalone binary using the Nuitka compiler. For example, here is how to package Bunnymark:</p> <p>You can create a standalone binary using the Nuitka compiler. For example, here is how to package Bunnymark:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>pip3 install nuitka <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>pip3 install nuitka
cd examples/textures cd examples/textures
python3 -m nuitka --onefile --linux-onefile-icon resources/wabbit_alpha.png textures_bunnymark.py python3 -m nuitka --onefile --linux-onefile-icon resources/wabbit_alpha.png textures_bunnymark.py
</pre></div> </pre></div>
</div> </div>
</section> </div>
<section id="advert"> <div class="tex2jax_ignore mathjax_ignore section" id="advert">
<h1>Advert<a class="headerlink" href="#advert" title="Link to this heading"></a></h1> <h1>Advert<a class="headerlink" href="#advert" title="Permalink to this headline"></a></h1>
<p><a class="reference external" href="https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git">RetroWar: 8-bit Party Battle</a> is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games.</p> <p><a class="reference external" href="https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git">RetroWar: 8-bit Party Battle</a> is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games.</p>
<p><a class="reference external" href="https://github.com/electronstudio/pygame-zero-book">Coding Games With Pygame Zero &amp; Python</a> is <p><a class="reference external" href="https://github.com/electronstudio/pygame-zero-book">Coding Games With Pygame Zero &amp; Python</a> is
a book for Python beginners.</p> a book for Python beginners.</p>
</section> </div>
</div> </div>

View file

@ -1,203 +0,0 @@
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Raspberry Pi &mdash; Raylib Python documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Building from source" href="BUILDING.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Raylib Python
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
<li class="toctree-l1"><a class="reference internal" href="pyray.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Raspberry Pi</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#option-1-binary-wheel">Option 1: Binary wheel</a></li>
<li class="toctree-l2"><a class="reference internal" href="#option-2-compile-raylib-from-source-x11-mode">Option 2: Compile Raylib from source X11 mode</a></li>
<li class="toctree-l2"><a class="reference internal" href="#option-3-compile-raylib-from-source-drm-mode">Option 3: Compile Raylib from source DRM mode</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Raylib Python</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Raspberry Pi</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/RPI.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="raspberry-pi">
<h1>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Link to this heading"></a></h1>
<p>Please use Raspberry Pi OS Bookworm. Bullseye should also work. Older OSes are not tested.</p>
<section id="option-1-binary-wheel">
<h2>Option 1: Binary wheel<a class="headerlink" href="#option-1-binary-wheel" title="Link to this heading"></a></h2>
<p>We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11 mode.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span>
</pre></div>
</div>
<p>Alternatively there is a DRM wheel called <code class="docutils literal notranslate"><span class="pre">raylib_drm</span></code> to use the framebuffer without X11. You cant have both wheels
installed at once.</p>
<p>If it doesnt work, or youre not on Bullseye, or youre 32 bit, you will need to compile your own raylib. See below.
For full instructions on this, see <a class="reference external" href="https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi">https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi</a> . If you need help with this ask Raylib.</p>
</section>
<section id="option-2-compile-raylib-from-source-x11-mode">
<h2>Option 2: Compile Raylib from source X11 mode<a class="headerlink" href="#option-2-compile-raylib-from-source-x11-mode" title="Link to this heading"></a></h2>
<p>This should work for everyone.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">update</span>
<span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="n">python3</span><span class="o">-</span><span class="n">pip</span> <span class="n">cmake</span> <span class="n">libegl1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgbm</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgles2</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libdrm</span><span class="o">-</span><span class="n">dev</span> <span class="n">libglfw3</span><span class="o">-</span><span class="n">dev</span>
<span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">raysan5</span><span class="o">/</span><span class="n">raylib</span><span class="o">.</span><span class="n">git</span> <span class="o">--</span><span class="n">branch</span> <span class="mf">5.0</span> <span class="o">--</span><span class="n">single</span><span class="o">-</span><span class="n">branch</span>
<span class="n">cd</span> <span class="n">raylib</span>
<span class="n">mkdir</span> <span class="n">build</span>
<span class="n">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="n">build</span><span class="o">/*</span>
<span class="n">cd</span> <span class="n">build</span>
<span class="n">cmake</span> <span class="o">-</span><span class="n">DPLATFORM</span><span class="o">=</span><span class="s2">&quot;Desktop&quot;</span> <span class="o">-</span><span class="n">DOPENGL_VERSION</span><span class="o">=</span><span class="mf">2.1</span> <span class="o">-</span><span class="n">DBUILD_EXAMPLES</span><span class="o">=</span><span class="n">OFF</span> <span class="o">-</span><span class="n">DCUSTOMIZE_BUILD</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_JPG</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_FLAC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DWITH_PIC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">..</span>
<span class="n">make</span>
<span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span>
<span class="n">sudo</span> <span class="n">cp</span> <span class="o">-</span><span class="n">r</span> <span class="o">../</span><span class="n">src</span><span class="o">/</span><span class="n">external</span><span class="o">/</span><span class="n">glfw</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">GLFW</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">include</span><span class="o">/</span>
</pre></div>
</div>
<p>Then have pip compile and install the wheel:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">setuptools</span>
<span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="o">-</span><span class="nb">dir</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span><span class="o">==</span><span class="mf">5.5.0.0</span>
</pre></div>
</div>
</section>
<section id="option-3-compile-raylib-from-source-drm-mode">
<h2>Option 3: Compile Raylib from source DRM mode<a class="headerlink" href="#option-3-compile-raylib-from-source-drm-mode" title="Link to this heading"></a></h2>
<p>This seems to work on Raspberry Pi 4. Note you must not be running X11 when you run your programs.</p>
<p>If you have ever installed Raylib or raylib-python-cffi before, remove all traces of it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">remove</span> <span class="n">raylib</span> <span class="n">raylib</span><span class="o">-</span><span class="n">dev</span> <span class="n">libraylib</span> <span class="n">libraylib</span><span class="o">-</span><span class="n">dev</span>
<span class="n">sudo</span> <span class="n">rm</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">pkgconfig</span><span class="o">/</span><span class="n">raylib</span><span class="o">.</span><span class="n">pc</span>
<span class="n">sudo</span> <span class="n">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">libraylib</span><span class="o">.*</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">libraylib</span><span class="o">.*</span>
</pre></div>
</div>
<p>Remove all GLFW:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">remove</span> <span class="n">libglfw3</span><span class="o">-</span><span class="n">dev</span> <span class="n">libglfw3</span>
<span class="n">sudo</span> <span class="n">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">GLFW</span>
</pre></div>
</div>
<p>Build a shared lib version of Raylib in DRM mode and install to /usr:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">update</span>
<span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="n">python3</span><span class="o">-</span><span class="n">pip</span> <span class="n">cmake</span> <span class="n">libegl1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgbm</span><span class="o">-</span><span class="n">dev</span> <span class="n">libgles2</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span> <span class="n">libdrm</span><span class="o">-</span><span class="n">dev</span>
<span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">raysan5</span><span class="o">/</span><span class="n">raylib</span><span class="o">.</span><span class="n">git</span> <span class="o">--</span><span class="n">branch</span> <span class="mf">5.0</span> <span class="o">--</span><span class="n">single</span><span class="o">-</span><span class="n">branch</span>
<span class="n">cd</span> <span class="n">raylib</span>
<span class="n">mkdir</span> <span class="n">build</span>
<span class="n">rm</span> <span class="n">rf</span> <span class="n">build</span><span class="o">/*</span>
<span class="n">cd</span> <span class="n">build</span>
<span class="n">cmake</span> <span class="o">-</span><span class="n">DPLATFORM</span><span class="o">=</span><span class="s2">&quot;DRM&quot;</span> <span class="o">-</span><span class="n">DBUILD_EXAMPLES</span><span class="o">=</span><span class="n">OFF</span> <span class="o">-</span><span class="n">DCUSTOMIZE_BUILD</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_JPG</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DSUPPORT_FILEFORMAT_FLAC</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DCMAKE_BUILD_TYPE</span><span class="o">=</span><span class="n">Release</span> <span class="o">-</span><span class="n">DBUILD_SHARED_LIBS</span><span class="o">=</span><span class="n">ON</span> <span class="o">-</span><span class="n">DCMAKE_INSTALL_PREFIX</span><span class="p">:</span><span class="n">PATH</span><span class="o">=/</span><span class="n">usr</span> <span class="o">..</span>
<span class="n">make</span>
<span class="n">sudo</span> <span class="n">make</span> <span class="n">install</span>
</pre></div>
</div>
<p>Then have pip compile and install the wheel:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">setuptools</span>
<span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="o">-</span><span class="nb">dir</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span><span class="o">==</span><span class="mf">5.5.0.0</span>
</pre></div>
</div>
<div class="admonition attention">
<p class="admonition-title">Attention</p>
<p>If you intend to use the Broadcom proprietary Open GL ES 2.0 drivers (the ones installed by Raspbian into <code class="docutils literal notranslate"><span class="pre">/opt/vc</span></code> and compiled in Raylib
with <code class="docutils literal notranslate"><span class="pre">PLATFORM_RPI</span></code>) be aware they not work with Bullseye and have not been tested with the bindings. They will probably
require additional linker arguments to be added to <code class="docutils literal notranslate"><span class="pre">build.py</span></code>. Suggest you try <code class="docutils literal notranslate"><span class="pre">PLATFORM_DRM</span></code> instead.</p>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="BUILDING.html" class="btn btn-neutral float-left" title="Building from source" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2021, Richard Smith.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -9,14 +9,12 @@ This is useful if the binaries dont work on your system, or you want to use a
First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this First make sure Raylib is installed. On Linux/Mac it must include the pkg-config files. Best way to ensure this
is to compile and install Raylib using CMake: https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake is to compile and install Raylib using CMake: https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux#build-raylib-using-cmake
Requirements for build: cmake, pkg-config.
:: ::
cd raylib-5.0 cd raylib-4.0.0
mkdir build mkdir build
cd build cd build
cmake -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
make make
sudo make install sudo make install
@ -26,7 +24,7 @@ Then ask Pip to build from source:
:: ::
pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib pip3 install --no-binary raylib --upgrade --force-reinstall raylib
Or, Build from source manually Or, Build from source manually
------------------------------ ------------------------------
@ -38,7 +36,7 @@ project.
If the Pip build doesnt work, please submit a bug. (And if you have If the Pip build doesnt work, please submit a bug. (And if you have
fixed it, a PR.) fixed it, a PR.)
Manual instructions follow, but are probably outdated, so see instead how we actually build the wheels Manual instructions follow, but may be outdated, so see also how we actually build the wheels
at https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml at https://github.com/electronstudio/raylib-python-cffi/blob/master/.github/workflows/build.yml
Windows manual build Windows manual build
@ -115,11 +113,11 @@ Build and install Raylib from the raylib-c directory.
:: ::
sudo apt install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config cmake sudo apt install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
cd raylib-python-cffi/raylib-c cd raylib-python-cffi/raylib-c
mkdir build mkdir build
cd build cd build
cmake -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release ..
sudo make install sudo make install
.. note:: Optional: Build the Raylib shared libs, if you plan to use .. note:: Optional: Build the Raylib shared libs, if you plan to use
@ -137,7 +135,7 @@ Build and install Raylib from the raylib-c directory.
cd ../.. cd ../..
Build the Python library: Build
:: ::
@ -219,3 +217,37 @@ Build and install module.
python3 setup.py install python3 setup.py install
Raspberry Pi
~~~~~~~~~~~~
Latest info: https://github.com/electronstudio/raylib-python-cffi/issues/55#issuecomment-1012629701
Old possibly out of date info that was written for RPi3 and Raylib 3 follows.
The integrated GPU hardware in a Raspberry Pi (“VideoCore”) is rather
idiosyncratic, resulting in a complex set of software options. Probably
the most interesting two options for Raylib applications are:
1. Use the Broadcom proprietary Open GL ES 2.0 drivers, installed by
Raspbian into ``/opt/vc``. These are 32-bit only, and currently X11
doesnt use these for its acceleration, so this is most suitable for
driving the entire HDMI output from one application with minimal
overhead (no X11).
2. Use the more recent open-source ``vc4-fkms-v3d`` kernel driver. This
can run in either 32-bit or 64-bit, and X11 can use these, so using
X11 is probably the more common choice here.
With option 2, the regular linux install instructions above should
probably work as-is.
For option 1, then also follow the above instructions, but with these
modifications:
- With ``cmake``, use
``cmake -DWITH_PIC=on -DSTATIC=on -DSHARED=on -DPLATFORM='Raspberry Pi' ..``
(See
`here <https://github.com/electronstudio/raylib-python-cffi/issues/31#issuecomment-862078330>`__
for a Raspberry Pi wheel)

View file

@ -1,216 +1,77 @@
# Python Bindings for Raylib 5.5 # Python Bindings for Raylib 4.0.0
## Libraries: raymath, raygui, rlgl, physac and GLFW
## Backends: Desktop, SDL, DRM, Web
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
![PyPI - Downloads](https://img.shields.io/pypi/dm/raylib) New CFFI API static bindings.
Chatroom: [Discord](https://discord.gg/fKDwt85aX6)
HELP WANTED: [writing examples](https://github.com/electronstudio/raylib-python-cffi/issues/155)
Features:
* CFFI API static bindings.
* Automatically generated to be as close as possible to * Automatically generated to be as close as possible to
original Raylib. original Raylib.
* Faster, fewer bugs and easier to maintain than ctypes. * Faster, fewer bugs and easier to maintain than ctypes.
* Commercial-friendly license. * Commercial-friendly license.
* Docstrings and auto-completion. * Docstrings and auto-completion.
* Type checking with Mypy * **Now includes extra libraries: raygui, rlgl and physac**
[Full documentation](http://electronstudio.github.io/raylib-python-cffi) [Full documentation](http://electronstudio.github.io/raylib-python-cffi)
# Quickstart # Quickstart
`pip3 install raylib==5.5.0.2 --break-system-packages` `pip3 install raylib`
```python
from pyray import *
init_window(800, 450, "Hello")
while not window_should_close():
begin_drawing()
clear_background(WHITE)
draw_text("Hello world", 190, 200, 20, VIOLET)
end_drawing()
close_window()
```
# Installation from pyray import *
init_window(800, 450, "Hello")
If you are on a modern Linux you will probably want to create a venv:
python3 -m venv venv
source venv/bin/activate
Then make sure you have the latest pip installed:
python3 -m pip install --upgrade pip
Then install
python3 -m pip install setuptools
python3 -m pip install raylib==5.5.0.2
On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from
source, in which case you will need to have Raylib development libs installed, e.g.
using homebrew, apt, etc.
## Windows
Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)
Use an [official Windows Python release](https://www.python.org/downloads/windows/) rather than WSL, MSYS, etc.
## MacOS
Binaries require:
* arm64 MacOS 14
* x64 MacOS 10.13, or newer.
Older MacOS requires building from source but this is usually simple:
brew install pkg-config
brew install raylib
python3 -m pip install raylib==5.5.0.2
(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue
if you want to test them.)
## Linux
Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source.
(Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)
The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0
so may not work on other boards.
## Raspberry Pi
[Using on Rasperry Pi](RPI.rst)
# Backends
## Dynamic binding version
There is now a separate dynamic version of this binding:
python3 -m pip uninstall raylib
python3 -m pip install raylib_dynamic
It works on some systems where the static version doesn't, [but be sure to read these caveats before using it](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
You can't have multiple raylib packages installed at once.
## SDL backend
This is not well tested but has better support for controllers:
python3 -m pip uninstall raylib
python3 -m pip install raylib_sdl
You can't have multiple raylib packages installed at once.
## DRM backend
This uses the Linux framebuffer for devices that don't run X11/Wayland:
python3 -m pip uninstall raylib
python3 -m pip install raylib_drm
You can't have multiple raylib packages installed at once.
## Problems?
If it doesn't work, [try to build manually.](BUILDING.rst). If that works then [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues)
to let us know what you did.
If you need help you can try asking on [our discord](https://discord.gg/fKDwt85aX6). There is also a large [Raylib discord](https://discord.gg/raylib)
for issues that are not Python-specific.
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
# How to use
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
pyray. Do *not* `pip install pyray`). You can use either or both:
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
Use [the raylib module](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
### If you prefer a more Pythonistic API
Use [the pyray module](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
# Running in a web browser
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser. Usually the latest git version
is recommended.
Make a folder `my_project` with a file `main.py`:
```python
# /// script
# dependencies = [
# "cffi",
# "raylib"
# ]
# ///
import asyncio
import platform
from pyray import *
async def main(): # You MUST have an async main function
init_window(500, 500, "Hello")
platform.window.window_resize() # You MAY want to add this line
while not window_should_close(): while not window_should_close():
begin_drawing() begin_drawing()
clear_background(WHITE) clear_background(WHITE)
draw_text("Hello world", 190, 200, 20, VIOLET) draw_text("Hello world", 190, 200, 20, VIOLET)
end_drawing() end_drawing()
await asyncio.sleep(0) # You MUST call this in your main loop
close_window() close_window()
asyncio.run(main())
```
Then to create the web files and launch a web server: # Installation
python3.12 -m pip install --user --upgrade pygbag First make sure you have the latest pip installed:
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
Point your browser to http://localhost:8000 python3 -m pip install --upgrade pip
Some features may not work, so you can disable them like this: Then install
```python python3 -m pip install raylib
if platform.system() != "Emscripten": # audio may not work on current version of emscripten
init_audio_device()
```
This is all done by Pygbag rather than by me, so you should probably contact them with any issues. On most platforms it should install a binary wheel (Windows 10 x64, MacOS 10.15 x64, Linux Ubuntu1804 x64).
Carefully read all their [documentation](https://pygame-web.github.io/).
It does work for most of [these examples](https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/) If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g.
using homebrew, apt, etc.
[If it doesn't work, you can build manually.](BUILDING.rst)
## Dynamic binding version
There is now a separate dynamic version of this binding:
python3 -m pip install raylib_dynamic
[Read this before using raylib_dynamic](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
## Beta testing
You can install an alpha or beta version by specifying the exact version number like this:
python3 -m pip install raylib==4.0a6
# How to use
There are two APIs, you can use either or both:
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
Use [the C API](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
### If you prefer a slightly more Pythonistic API and don't mind it might be slightly slower
Use [the Python API](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
# App showcase # App showcase
[Tempest-raylib](https://github.com/Emtyloc/tempest-raylib)
[KarabinerKeyboard](https://github.com/bilbofroggins/KarabinerKeyboard)
[PyTaiko](https://github.com/Yonokid/PyTaiko)
[DOOM-Clone](https://github.com/StanislavPetrovV/DOOM-Clone)
[Tanki](https://github.com/pkulev/tanki) [Tanki](https://github.com/pkulev/tanki)
[Alloy Bloxel Editor](https://pebaz.itch.io/alloy-bloxel-editor)
[Eidolon](https://github.com/Miou-zora/Eidolon)
Add your app here! Add your app here!
# RLZero # RLZero
@ -224,43 +85,29 @@ A related library (that is a work in progress!):
* Converting more examples from C to Python * Converting more examples from C to Python
* Testing on more platforms * Testing on more platforms
# License # License (updated)
Eclipse Public License, so you are free to The bindings are now under the Eclipse Public License, so you are free to
statically link and use in non-free / proprietary / commercial projects! statically link and use in non-free / proprietary / commercial projects!
# Performance # Performance
If you need more performance, do in this order: For fastest performance use Pypy rather than standard Python.
1. Use Pypy rather than standard CPython. It is much, much faster and will make more difference than any other optimisations you might do. Every call to C is costly, so it's slightly faster if you use Python data structures and functions when calculating
2. Every call to C is costly, so it's slightly faster if you use Python data structures and functions when calculating
in your update loop in your update loop
and then only convert them to C data structures when you have to call the C functions for drawing. and then only convert them to C data structures when you have to call the C functions for drawing.
3. The raylib.* functions are potentially *slightly* faster than the pyray.* equivalents, so if you need a tiny bit more performance
you can switch your inner loop functions to these.
4. There is a version of Python that is faster than Pypy: GraalPy. However it's not fully compatible with all Python
packages. It doesn't work with CFFI and so doesn't work with this binding. But it *is* compatible with the
*Java* binding, Jaylib! There is an example of this here: https://github.com/electronstudio/megabunny/tree/master/raylib-python-jaylib
## Bunnymark ## Bunnymark
| Library | Implementation | Bunnies (60 FPS) | Percentage | | Library | Implementation | Bunnies (60 FPS) | Percentage |
|--------------------------------|-------------------|------------------|------------| | ------------- | ------------- | ------------- | ------------- |
| Raylib 5.0 | C | 180000 | 100% | | Raylib 3.7 | C | 168100 | 100% |
| Raylib Python CFFI 5.0.0.2 | Python 3.12 | 10500 | 5.8% | | Raylib Python CFFI 3.7 | Pypy 3.7 | 33800 | 20% |
| Raylib Python CFFI 5.0.0.2 | Pypy 3.10 | 95000 | 53% | | Raylib Python CFFI 3.7 | Python 3.9 | 7700 | 4.5% |
| Raylib 3.7 | C | 168100 | 100% | | Raylib Python CFFI 3.7 | Python 3.9 Nuitka | 8600 | 5.1% |
| Raylib Python CFFI 3.7 | Pypy 3.7 | 33800 | 20% | | Raylib Python CFFI 3.7 Dynamic | Python 3.9 | 6300 | 3.7% |
| Raylib Python CFFI 3.7 | Python 3.9 | 7700 | 4.5% |
| Raylib Python CFFI 3.7 | Python 3.9 Nuitka | 8600 | 5.1% |
| Raylib Python CFFI 3.7 Dynamic | Python 3.9 | 6300 | 3.7% |
See also https://github.com/electronstudio/megabunny/
# Packaging your app # Packaging your app
@ -275,4 +122,4 @@ You can create a standalone binary using the Nuitka compiler. For example, here
[RetroWar: 8-bit Party Battle](https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git) is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games. [RetroWar: 8-bit Party Battle](https://store.steampowered.com/app/664240/RetroWar_8bit_Party_Battle/?git) is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games.
[Coding Games With Pygame Zero & Python](https://github.com/electronstudio/pygame-zero-book) is [Coding Games With Pygame Zero & Python](https://github.com/electronstudio/pygame-zero-book) is
a book for Python beginners. a book for Python beginners.

View file

@ -1,97 +0,0 @@
Raspberry Pi
====================
Please use Raspberry Pi OS Bookworm. Bullseye should also work. Older OSes are not tested.
Option 1: Binary wheel
----------------------
We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11 mode.
::
python -m pip install --break-system-packages raylib
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
installed at once.
If it doesn't work, or you're not on Bullseye, or you're 32 bit, you will need to compile your own raylib. See below.
For full instructions on this, see https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi . If you need help with this ask Raylib.
Option 2: Compile Raylib from source X11 mode
---------------------------------------------
This should work for everyone.
::
sudo apt update
sudo apt install python3-pip cmake libegl1-mesa-dev libgbm-dev libgles2-mesa-dev libdrm-dev libglfw3-dev
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
cd raylib
mkdir build
rm -rf build/*
cd build
cmake -DPLATFORM="Desktop" -DOPENGL_VERSION=2.1 -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
make
sudo make install
sudo cp -r ../src/external/glfw/include/GLFW /usr/local/include/
Then have pip compile and install the wheel:
::
python3 -m pip install --break-system-packages setuptools
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
Option 3: Compile Raylib from source DRM mode
---------------------------------------------
This seems to work on Raspberry Pi 4. Note you must not be running X11 when you run your programs.
If you have ever installed Raylib or raylib-python-cffi before, remove all traces of it:
::
sudo apt remove raylib raylib-dev libraylib libraylib-dev
sudo rm /usr/local/lib/pkgconfig/raylib.pc
sudo rm -rf /usr/local/lib/libraylib.* /usr/lib/libraylib.*
Remove all GLFW:
::
sudo apt remove libglfw3-dev libglfw3
sudo rm -rf /usr/local/include/GLFW
Build a shared lib version of Raylib in DRM mode and install to /usr:
::
sudo apt update
sudo apt install python3-pip cmake libegl1-mesa-dev libgbm-dev libgles2-mesa-dev libdrm-dev
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
cd raylib
mkdir build
rm rf build/*
cd build
cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo make install
Then have pip compile and install the wheel:
::
python3 -m pip install --break-system-packages setuptools
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
.. attention::
If you intend to use the Broadcom proprietary Open GL ES 2.0 drivers (the ones installed by Raspbian into ``/opt/vc`` and compiled in Raylib
with ``PLATFORM_RPI``) be aware they not work with Bullseye and have not been tested with the bindings. They will probably
require additional linker arguments to be added to ``build.py``. Suggest you try ``PLATFORM_DRM`` instead.

View file

@ -13,7 +13,7 @@ CFFI ABI dynamic bindings avoid the need to compile a C extension module. They
Therefore I personally recommend the static ones. Therefore I personally recommend the static ones.
But the dynamic bindings have the advantage that you don't need to compile anything to install. You just need a Raylib DLL. But the dynamic bindings have the advantage that you don't need to compile anything to install. You just need a Raylib DLL.
The API is exactly the same as the static one documented here. (Therefore you can't have both modules installed at once.) The only difference is you can't do:: API is exactly the same as the static one documented here. (Therefore you can't have both modules installed at once.) The only difference is you can't do::
from raylib import * from raylib import *
@ -31,9 +31,6 @@ If you use the ``rl.`` prefix then code will work on both static and dynamic bin
If you access functions via ``import pyray`` then there is no difference at all, but be warned this hasn't been tested much. If you access functions via ``import pyray`` then there is no difference at all, but be warned this hasn't been tested much.
.. note::
Standard Raylib DLLs do not include additional libraries like Raygui, Physac, etc. So these functions won't work.
.. important:: .. important::

View file

@ -15,7 +15,6 @@ Raylib Python
raylib raylib
dynamic dynamic
BUILDING BUILDING
RPI
* :ref:`search` * :ref:`search`

View file

@ -1,18 +1,18 @@
Python API Python API
============== ==============
.. comment::
Link to API reference:
toctree::
:maxdepth: 1
autoapi/pyray/index
This is a wrapper around the C API with some syntactic sugar. This is a wrapper around the C API with some syntactic sugar.
The API is *still the same as Raylib*, so you should still reply on: The API is *still the same as Raylib*, so you should still reply on `the official Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_, except:
* `the C Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib examples <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
* `the C Raylib header file <https://github.com/raysan5/raylib/blob/master/src/raylib.h>`_
The *differences* are:
* the function names are in **snake_case**. * the function names are in **snake_case**.
@ -20,9 +20,6 @@ The *differences* are:
* There are some helper functions to create structures. * There are some helper functions to create structures.
Examples
--------
Example program: Example program:
.. code-block:: .. code-block::
@ -33,9 +30,10 @@ Example program:
pr.set_target_fps(60) pr.set_target_fps(60)
camera = pr.Camera3D([18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0) camera = pr.Camera3D([18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0)
pr.set_camera_mode(camera, pr.CAMERA_ORBITAL)
while not pr.window_should_close(): while not pr.window_should_close():
pr.update_camera(camera, pr.CAMERA_ORBITAL) pr.update_camera(camera)
pr.begin_drawing() pr.begin_drawing()
pr.clear_background(pr.RAYWHITE) pr.clear_background(pr.RAYWHITE)
pr.begin_mode_3d(camera) pr.begin_mode_3d(camera)
@ -56,9 +54,9 @@ Example program:
init_window(800, 450, "Raylib texture test") init_window(800, 450, "Raylib texture test")
... ...
You don't need to use the PyRay() class anymore.
`See all examples here <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_ See also https://github.com/electronstudio/raylib-python-cffi/blob/master/tests/test_pyray.py
API reference API reference
------------- -------------

View file

@ -1,8 +1,7 @@
C API C API
============= =============
The goal of the C API is make usage as similar to the original C as CFFI will allow. The goal of the C API is make usage as similar to the original C as CFFI will allow. The `example programs <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
So the `example programs <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
are very, very similar to the C originals. are very, very similar to the C originals.
Example program: Example program:
@ -15,9 +14,10 @@ Example program:
SetTargetFPS(60) SetTargetFPS(60)
camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0]) camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0])
SetCameraMode(camera[0], CAMERA_ORBITAL)
while not WindowShouldClose(): while not WindowShouldClose():
UpdateCamera(camera, CAMERA_ORBITAL) UpdateCamera(camera)
BeginDrawing() BeginDrawing()
ClearBackground(RAYWHITE) ClearBackground(RAYWHITE)
BeginMode3D(camera[0]) BeginMode3D(camera[0])
@ -39,16 +39,11 @@ If you want to be more portable (i.e. same code will work with dynamic bindings)
... ...
See also https://github.com/electronstudio/raylib-python-cffi/blob/master/tests/test_static.py
.. note:: Whenever you need to convert stuff between C and Python see https://cffi.readthedocs.io .. note:: Whenever you need to convert stuff between C and Python see https://cffi.readthedocs.io
.. important:: Your **primary reference** should always be .. important:: Your **primary reference** should always be `the official Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib docs <https://www.raylib.com/cheatsheet/cheatsheet.html>`_
* `the C Raylib examples <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
* `the C Raylib header file <https://github.com/raysan5/raylib/blob/master/src/raylib.h>`_
However, here is a list of available functions: However, here is a list of available functions:

View file

@ -1,123 +0,0 @@
/* Compatability shim for jQuery and underscores.js.
*
* Copyright Sphinx contributors
* Released under the two clause BSD licence
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

190
docs/_static/basic.css vendored
View file

@ -1,5 +1,12 @@
/* /*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme. * Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/ */
/* -- main layout ----------------------------------------------------------- */ /* -- main layout ----------------------------------------------------------- */
@ -108,18 +115,22 @@ img {
/* -- search page ----------------------------------------------------------- */ /* -- search page ----------------------------------------------------------- */
ul.search { ul.search {
margin-top: 10px; margin: 10px 0 0 20px;
padding: 0;
} }
ul.search li { ul.search li {
padding: 5px 0; padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
} }
ul.search li a { ul.search li a {
font-weight: bold; font-weight: bold;
} }
ul.search li p.context { ul.search li div.context {
color: #888; color: #888;
margin: 2px 0 0 30px; margin: 2px 0 0 30px;
text-align: left; text-align: left;
@ -211,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */ /* -- general body styles --------------------------------------------------- */
div.body { div.body {
min-width: 360px; min-width: 450px;
max-width: 800px; max-width: 800px;
} }
@ -226,8 +237,14 @@ a.headerlink {
visibility: hidden; visibility: hidden;
} }
a:visited { a.brackets:before,
color: #551A8B; span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
} }
h1:hover > a.headerlink, h1:hover > a.headerlink,
@ -260,25 +277,25 @@ p.rubric {
font-weight: bold; font-weight: bold;
} }
img.align-left, figure.align-left, .figure.align-left, object.align-left { img.align-left, .figure.align-left, object.align-left {
clear: left; clear: left;
float: left; float: left;
margin-right: 1em; margin-right: 1em;
} }
img.align-right, figure.align-right, .figure.align-right, object.align-right { img.align-right, .figure.align-right, object.align-right {
clear: right; clear: right;
float: right; float: right;
margin-left: 1em; margin-left: 1em;
} }
img.align-center, figure.align-center, .figure.align-center, object.align-center { img.align-center, .figure.align-center, object.align-center {
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
img.align-default, figure.align-default, .figure.align-default { img.align-default, .figure.align-default {
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
@ -302,8 +319,7 @@ img.align-default, figure.align-default, .figure.align-default {
/* -- sidebars -------------------------------------------------------------- */ /* -- sidebars -------------------------------------------------------------- */
div.sidebar, div.sidebar {
aside.sidebar {
margin: 0 0 0.5em 1em; margin: 0 0 0.5em 1em;
border: 1px solid #ddb; border: 1px solid #ddb;
padding: 7px; padding: 7px;
@ -318,16 +334,12 @@ p.sidebar-title {
font-weight: bold; font-weight: bold;
} }
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote { div.admonition, div.topic, blockquote {
clear: left; clear: left;
} }
/* -- topics ---------------------------------------------------------------- */ /* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic { div.topic {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 7px; padding: 7px;
@ -365,18 +377,12 @@ div.body p.centered {
/* -- content of sidebars/topics/admonitions -------------------------------- */ /* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child, div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child, div.topic > :last-child,
div.admonition > :last-child { div.admonition > :last-child {
margin-bottom: 0; margin-bottom: 0;
} }
div.sidebar::after, div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after, div.topic::after,
div.admonition::after, div.admonition::after,
blockquote::after { blockquote::after {
@ -419,6 +425,10 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa; border-bottom: 1px solid #aaa;
} }
table.footnote td, table.footnote th {
border: 0 !important;
}
th { th {
text-align: left; text-align: left;
padding-right: 5px; padding-right: 5px;
@ -445,22 +455,20 @@ td > :last-child {
/* -- figures --------------------------------------------------------------- */ /* -- figures --------------------------------------------------------------- */
div.figure, figure { div.figure {
margin: 0.5em; margin: 0.5em;
padding: 0.5em; padding: 0.5em;
} }
div.figure p.caption, figcaption { div.figure p.caption {
padding: 0.3em; padding: 0.3em;
} }
div.figure p.caption span.caption-number, div.figure p.caption span.caption-number {
figcaption span.caption-number {
font-style: italic; font-style: italic;
} }
div.figure p.caption span.caption-text, div.figure p.caption span.caption-text {
figcaption span.caption-text {
} }
/* -- field list styles ----------------------------------------------------- */ /* -- field list styles ----------------------------------------------------- */
@ -495,63 +503,6 @@ table.hlist td {
vertical-align: top; vertical-align: top;
} }
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */ /* -- other body styles ----------------------------------------------------- */
@ -602,26 +553,19 @@ ul.simple p {
margin-bottom: 0; margin-bottom: 0;
} }
aside.footnote > span, dl.footnote > dt,
div.citation > span { dl.citation > dt {
float: left; float: left;
margin-right: 0.5em;
} }
aside.footnote > span:last-of-type,
div.citation > span:last-of-type { dl.footnote > dd,
padding-right: 0.5em; dl.citation > dd {
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em; margin-bottom: 0em;
} }
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after { dl.footnote > dd:after,
dl.citation > dd:after {
content: ""; content: "";
clear: both; clear: both;
} }
@ -638,6 +582,10 @@ dl.field-list > dt {
padding-right: 5px; padding-right: 5px;
} }
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd { dl.field-list > dd {
padding-left: 0.5em; padding-left: 0.5em;
margin-top: 0em; margin-top: 0em;
@ -663,16 +611,6 @@ dd {
margin-left: 30px; margin-left: 30px;
} }
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child, dl > dd:last-child,
dl > dd:last-child > :last-child { dl > dd:last-child > :last-child {
margin-bottom: 0; margin-bottom: 0;
@ -691,6 +629,14 @@ dl.glossary dt {
font-size: 1.1em; font-size: 1.1em;
} }
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified { .versionmodified {
font-style: italic; font-style: italic;
} }
@ -731,9 +677,8 @@ dl.glossary dt {
.classifier:before { .classifier:before {
font-style: normal; font-style: normal;
margin: 0 0.5em; margin: 0.5em;
content: ":"; content: ":";
display: inline-block;
} }
abbr, acronym { abbr, acronym {
@ -757,7 +702,6 @@ span.pre {
-ms-hyphens: none; -ms-hyphens: none;
-webkit-hyphens: none; -webkit-hyphens: none;
hyphens: none; hyphens: none;
white-space: nowrap;
} }
div[class*="highlight-"] { div[class*="highlight-"] {
@ -821,12 +765,8 @@ div.code-block-caption code {
table.highlighttable td.linenos, table.highlighttable td.linenos,
span.linenos, span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */ div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none; user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
} }
div.code-block-caption span.caption-number { div.code-block-caption span.caption-number {
@ -841,6 +781,16 @@ div.literal-block-wrapper {
margin: 1em 0; margin: 1em 0;
} }
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code { code.xref, a code {
background-color: transparent; background-color: transparent;
font-weight: bold; font-weight: bold;

View file

@ -1 +1 @@
.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} .fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

File diff suppressed because one or more lines are too long

View file

@ -1,149 +1,316 @@
/* /*
* Base JavaScript utilities for all Sphinx HTML documentation. * doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/ */
"use strict";
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ /**
"TEXTAREA", * select a different prefix for underscore
"INPUT", */
"SELECT", $u = _.noConflict();
"BUTTON",
]);
const _ready = (callback) => { /**
if (document.readyState !== "loading") { * make the code below compatible with browsers without
callback(); * an installed firebug like debugger
} else { if (!window.console || !console.firebug) {
document.addEventListener("DOMContentLoaded", callback); var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
} "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
}; };
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/** /**
* Small JavaScript module for the documentation. * Small JavaScript module for the documentation.
*/ */
const Documentation = { var Documentation = {
init: () => {
Documentation.initDomainIndexTable(); init : function() {
Documentation.initOnKeyListeners(); this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
}, },
/** /**
* i18n support * i18n support
*/ */
TRANSLATIONS: {}, TRANSLATIONS : {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE: "unknown", LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions // gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext) // can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => { gettext : function(string) {
const translated = Documentation.TRANSLATIONS[string]; var translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) { if (typeof translated === 'undefined')
case "undefined": return string;
return string; // no translation return (typeof translated === 'string') ? translated : translated[0];
case "string": },
return translated; // translation exists
default: ngettext : function(singular, plural, n) {
return translated[0]; // (singular, plural) translation tuple exists var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
} }
}, },
ngettext: (singular, plural, n) => { /**
const translated = Documentation.TRANSLATIONS[singular]; * init the domain index toggle buttons
if (typeof translated !== "undefined") */
return translated[Documentation.PLURAL_EXPR(n)]; initIndexTable : function() {
return n === 1 ? singular : plural; var togglers = $('img.toggler').click(function() {
}, var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
addTranslations: (catalog) => { $('tr.cg-' + idnum).toggle();
Object.assign(Documentation.TRANSLATIONS, catalog.messages); if (src.substr(-9) === 'minus.png')
Documentation.PLURAL_EXPR = new Function( $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
"n", else
`return (${catalog.plural_expr})` $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
); }).css('display', '');
Documentation.LOCALE = catalog.locale; if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
}, },
/** /**
* helper function to focus on search bar * helper function to hide the search marks again
*/ */
focusSearchBar: () => { hideSearchWords : function() {
document.querySelectorAll("input[name=q]")[0]?.focus(); $('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
}, },
/** /**
* Initialise the domain index toggle buttons * make the url absolute
*/ */
initDomainIndexTable: () => { makeURL : function(relativeURL) {
const toggler = (el) => { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
}, },
initOnKeyListeners: () => { /**
// only install a listener if it is really needed * get the current relative url
if ( */
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && getCurrentURL : function() {
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS var path = document.location.pathname;
) var parts = path.split(/\//);
return; $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
document.addEventListener("keydown", (event) => { initOnKeyListeners: function() {
// bail for input elements $(document).keydown(function(event) {
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; var activeElementType = document.activeElement.tagName;
// bail with special keys // don't navigate when in search box, textarea, dropdown or button
if (event.altKey || event.ctrlKey || event.metaKey) return; if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
&& activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
if (!event.shiftKey) { && !event.shiftKey) {
switch (event.key) { switch (event.keyCode) {
case "ArrowLeft": case 37: // left
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
const prevLink = document.querySelector('link[rel="prev"]'); window.location.href = prevHref;
if (prevLink && prevLink.href) { return false;
window.location.href = prevLink.href;
event.preventDefault();
} }
break; case 39: // right
case "ArrowRight": var nextHref = $('link[rel="next"]').prop('href');
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; if (nextHref) {
window.location.href = nextHref;
const nextLink = document.querySelector('link[rel="next"]'); return false;
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
} }
break;
} }
} }
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
}); });
}, }
}; };
// quick alias for translations // quick alias for translations
const _ = Documentation.gettext; _ = Documentation.gettext;
_ready(Documentation.init); $(document).ready(function() {
Documentation.init();
});

View file

@ -1,13 +1,12 @@
const DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '', VERSION: '',
LANGUAGE: 'en', LANGUAGE: 'None',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
BUILDER: 'html', BUILDER: 'html',
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html', LINK_SUFFIX: '.html',
HAS_SOURCE: true, HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt', SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false, NAVIGATION_WITH_KEYS: false
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
}; };

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,5 +1,12 @@
/* /*
* graphviz.css
* ~~~~~~~~~~~~
*
* Sphinx stylesheet -- graphviz extension. * Sphinx stylesheet -- graphviz extension.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/ */
img.graphviz { img.graphviz {

10872
docs/_static/jquery.js vendored

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,4 @@
/**
* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document);

4
docs/_static/js/html5shiv.min.js vendored Normal file
View file

@ -0,0 +1,4 @@
/**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);

View file

@ -1,228 +0,0 @@
const themeFlyoutDisplay = "hidden";
const themeVersionSelector = true;
const themeLanguageSelector = true;
if (themeFlyoutDisplay === "attached") {
function renderLanguages(config) {
if (!config.projects.translations.length) {
return "";
}
// Insert the current language to the options on the selector
let languages = config.projects.translations.concat(config.projects.current);
languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name));
const languagesHTML = `
<dl>
<dt>Languages</dt>
${languages
.map(
(translation) => `
<dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${translation.urls.documentation}">${translation.language.code}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return languagesHTML;
}
function renderVersions(config) {
if (!config.versions.active.length) {
return "";
}
const versionsHTML = `
<dl>
<dt>Versions</dt>
${config.versions.active
.map(
(version) => `
<dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${version.urls.documentation}">${version.slug}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return versionsHTML;
}
function renderDownloads(config) {
if (!Object.keys(config.versions.current.downloads).length) {
return "";
}
const downloadsNameDisplay = {
pdf: "PDF",
epub: "Epub",
htmlzip: "HTML",
};
const downloadsHTML = `
<dl>
<dt>Downloads</dt>
${Object.entries(config.versions.current.downloads)
.map(
([name, url]) => `
<dd>
<a href="${url}">${downloadsNameDisplay[name]}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return downloadsHTML;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const flyout = `
<div class="rst-versions" data-toggle="rst-versions" role="note">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span>
v: ${config.versions.current.slug}
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<div class="injected">
${renderLanguages(config)}
${renderVersions(config)}
${renderDownloads(config)}
<dl>
<dt>On Read the Docs</dt>
<dd>
<a href="${config.projects.current.urls.home}">Project Home</a>
</dd>
<dd>
<a href="${config.projects.current.urls.builds}">Builds</a>
</dd>
<dd>
<a href="${config.projects.current.urls.downloads}">Downloads</a>
</dd>
</dl>
<dl>
<dt>Search</dt>
<dd>
<form id="flyout-search-form">
<input
class="wy-form"
type="text"
name="q"
aria-label="Search docs"
placeholder="Search docs"
/>
</form>
</dd>
</dl>
<hr />
<small>
<span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span>
</small>
</div>
</div>
`;
// Inject the generated flyout into the body HTML element.
document.body.insertAdjacentHTML("beforeend", flyout);
// Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.
document
.querySelector("#flyout-search-form")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
})
}
if (themeLanguageSelector || themeVersionSelector) {
function onSelectorSwitch(event) {
const option = event.target.selectedIndex;
const item = event.target.options[option];
window.location.href = item.dataset.url;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const versionSwitch = document.querySelector(
"div.switch-menus > div.version-switch",
);
if (themeVersionSelector) {
let versions = config.versions.active;
if (config.versions.current.hidden || config.versions.current.type === "external") {
versions.unshift(config.versions.current);
}
const versionSelect = `
<select>
${versions
.map(
(version) => `
<option
value="${version.slug}"
${config.versions.current.slug === version.slug ? 'selected="selected"' : ""}
data-url="${version.urls.documentation}">
${version.slug}
</option>`,
)
.join("\n")}
</select>
`;
versionSwitch.innerHTML = versionSelect;
versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
const languageSwitch = document.querySelector(
"div.switch-menus > div.language-switch",
);
if (themeLanguageSelector) {
if (config.projects.translations.length) {
// Add the current language to the options on the selector
let languages = config.projects.translations.concat(
config.projects.current,
);
languages = languages.sort((a, b) =>
a.language.name.localeCompare(b.language.name),
);
const languageSelect = `
<select>
${languages
.map(
(language) => `
<option
value="${language.language.code}"
${config.projects.current.slug === language.slug ? 'selected="selected"' : ""}
data-url="${language.urls.documentation}">
${language.language.name}
</option>`,
)
.join("\n")}
</select>
`;
languageSwitch.innerHTML = languageSelect;
languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
else {
languageSwitch.remove();
}
}
});
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
// Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.
document
.querySelector("[role='search'] input")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
});

View file

@ -1,13 +1,19 @@
/* /*
* language_data.js
* ~~~~~~~~~~~~~~~~
*
* This script contains the language-specific data used by searchtools.js, * This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter. * namely the list of stopwords, stemmer, scorer and splitter.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/ */
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
/* Non-minified version is copied as a separate JS file, if available */ /* Non-minified version JS is _stemmer.js if file is provided */
/** /**
* Porter Stemmer * Porter Stemmer
*/ */
@ -190,3 +196,102 @@ var Stemmer = function() {
} }
} }
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

View file

@ -1,31 +1,30 @@
pre { line-height: 125%; } pre { line-height: 125%; margin: 0; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc } .highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; } .highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */ .highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */ .highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ .highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ .highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #FFF0F0 } /* Comment.Special */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gr { color: #F00 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333 } /* Generic.Output */ .highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #C65D09; font-weight: bold } /* Generic.Prompt */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */ .highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
@ -33,43 +32,43 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */ .highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070A0 } /* Literal.String */ .highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070A0 } /* Name.Attribute */ .highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0E84B5; font-weight: bold } /* Name.Class */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60ADD5 } /* Name.Constant */ .highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555; font-weight: bold } /* Name.Decorator */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #D55537; font-weight: bold } /* Name.Entity */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */ .highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287E } /* Name.Function */ .highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0E84B5; font-weight: bold } /* Name.Namespace */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #BB60D5 } /* Name.Variable */ .highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */ .highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sa { color: #4070A0 } /* Literal.String.Affix */ .highlight .sa { color: #4070a0 } /* Literal.String.Affix */
.highlight .sb { color: #4070A0 } /* Literal.String.Backtick */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070A0 } /* Literal.String.Char */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .dl { color: #4070A0 } /* Literal.String.Delimiter */ .highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
.highlight .sd { color: #4070A0; font-style: italic } /* Literal.String.Doc */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070A0 } /* Literal.String.Double */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070A0; font-weight: bold } /* Literal.String.Escape */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070A0 } /* Literal.String.Heredoc */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70A0D0; font-style: italic } /* Literal.String.Interpol */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #C65D09 } /* Literal.String.Other */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070A0 } /* Literal.String.Single */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06287E } /* Name.Function.Magic */ .highlight .fm { color: #06287e } /* Name.Function.Magic */
.highlight .vc { color: #BB60D5 } /* Name.Variable.Class */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #BB60D5 } /* Name.Variable.Global */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #BB60D5 } /* Name.Variable.Instance */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .vm { color: #BB60D5 } /* Name.Variable.Magic */ .highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

File diff suppressed because it is too large Load diff

View file

@ -1,154 +0,0 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
const rest = document.createTextNode(val.substr(pos + text.length));
parent.insertBefore(
span,
parent.insertBefore(
rest,
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
/* There may be more occurrences of search term in this node. So call this
* function recursively on the remaining fragment.
*/
_highlight(rest, addItems, text, className);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms")
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
// get individual terms from highlight string
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:SphinxHighlight.hideSearchWords()">' +
_("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms")
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(() => {
/* Do not call highlightSearchWords() when we are on the search page.
* It will highlight words from the *previous* search query.
*/
if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
SphinxHighlight.initEscapeListener();
});

1707
docs/_static/underscore.js vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,22 +1,18 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dynamic Bindings &mdash; Raylib Python documentation</title> <title>Dynamic Bindings &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" /> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/jquery.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
@ -29,32 +25,26 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Raylib Python
<a href="index.html" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -62,7 +52,6 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Dynamic Bindings</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -78,8 +67,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Dynamic Bindings</li> <li>Dynamic Bindings</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/dynamic.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/dynamic.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
@ -89,8 +78,8 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="dynamic-bindings"> <div class="section" id="dynamic-bindings">
<h1>Dynamic Bindings<a class="headerlink" href="#dynamic-bindings" title="Link to this heading"></a></h1> <h1>Dynamic Bindings<a class="headerlink" href="#dynamic-bindings" title="Permalink to this headline"></a></h1>
<p>CFFI ABI dynamic bindings avoid the need to compile a C extension module. They now been moved to a separate module:</p> <p>CFFI ABI dynamic bindings avoid the need to compile a C extension module. They now been moved to a separate module:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">raylib_dynamic</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">raylib_dynamic</span>
</pre></div> </pre></div>
@ -103,12 +92,12 @@ so you dont even know something has gone wrong and you dont get proper sta
Therefore I personally recommend the static ones. Therefore I personally recommend the static ones.
But the dynamic bindings have the advantage that you dont need to compile anything to install. You just need a Raylib DLL.</p> But the dynamic bindings have the advantage that you dont need to compile anything to install. You just need a Raylib DLL.</p>
</div> </div>
<p>The API is exactly the same as the static one documented here. (Therefore you cant have both modules installed at once.) The only difference is you cant do:</p> <p>API is exactly the same as the static one documented here. (Therefore you cant have both modules installed at once.) The only difference is you cant do:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">raylib</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">raylib</span> <span class="kn">import</span> <span class="o">*</span>
</pre></div> </pre></div>
</div> </div>
<p>Instead you have to do:</p> <p>Instead you have to do:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">raylib</span><span class="w"> </span><span class="kn">import</span> <span class="n">rl</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">raylib</span> <span class="kn">import</span> <span class="n">rl</span>
</pre></div> </pre></div>
</div> </div>
<p>Then you access the functions with <code class="docutils literal notranslate"><span class="pre">rl.</span></code> prefix.</p> <p>Then you access the functions with <code class="docutils literal notranslate"><span class="pre">rl.</span></code> prefix.</p>
@ -118,16 +107,12 @@ But the dynamic bindings have the advantage that you dont need to compile any
<p class="admonition-title">Tip</p> <p class="admonition-title">Tip</p>
<p>If you access functions via <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">pyray</span></code> then there is no difference at all, but be warned this hasnt been tested much.</p> <p>If you access functions via <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">pyray</span></code> then there is no difference at all, but be warned this hasnt been tested much.</p>
</div> </div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Standard Raylib DLLs do not include additional libraries like Raygui, Physac, etc. So these functions wont work.</p>
</div>
<div class="admonition important"> <div class="admonition important">
<p class="admonition-title">Important</p> <p class="admonition-title">Important</p>
<p>If your system already has the Raylib library installed, you can set the environment variable <code class="docutils literal notranslate"><span class="pre">USE_EXTERNAL_RAYLIB</span></code> and it will <p>If your system already has the Raylib library installed, you can set the environment variable <code class="docutils literal notranslate"><span class="pre">USE_EXTERNAL_RAYLIB</span></code> and it will
always be used instead of the bundled DLLs.</p> always be used instead of the bundled DLLs.</p>
</div> </div>
</section> </div>
</div> </div>

File diff suppressed because it is too large Load diff

View file

@ -1,26 +1,22 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Raylib Python &mdash; Raylib Python documentation</title> <title>Raylib Python &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" /> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/jquery.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Python Bindings for Raylib 5.5" href="README.html" /> <link rel="next" title="Python Bindings for Raylib 4.0.0" href="README.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
@ -28,32 +24,26 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="#" class="icon icon-home"> Raylib Python
<a href="#" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -61,7 +51,6 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li> <li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -77,8 +66,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="#" class="icon icon-home" aria-label="Home"></a></li> <li><a href="#" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Raylib Python</li> <li>Raylib Python</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
@ -88,21 +77,19 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="raylib-python"> <div class="section" id="raylib-python">
<h1>Raylib Python<a class="headerlink" href="#raylib-python" title="Link to this heading"></a></h1> <h1>Raylib Python<a class="headerlink" href="#raylib-python" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -110,19 +97,18 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li> <li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li> <li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul> </ul>
</section> </div>
</div> </div>
</div> </div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="README.html" class="btn btn-neutral float-right" title="Python Bindings for Raylib 5.5" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> <a href="README.html" class="btn btn-neutral float-right" title="Python Bindings for Raylib 4.0.0" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div> </div>
<hr/> <hr/>

Binary file not shown.

View file

@ -1,21 +1,18 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python Module Index &mdash; Raylib Python documentation</title> <title>Python Module Index &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" /> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/jquery.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
@ -33,32 +30,26 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Raylib Python
<a href="index.html" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -66,7 +57,6 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li> <li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -82,8 +72,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Python Module Index</li> <li>Python Module Index</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
</li> </li>
</ul> </ul>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,22 +1,19 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./"> <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Search &mdash; Raylib Python documentation</title> <title>Search &mdash; Raylib Python documentation</title><link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
<script src="_static/jquery.js?v=5d32c60e"></script> <!--[if lt IE 9]>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/js/html5shiv.min.js"></script>
<script src="_static/documentation_options.js?v=5929fcd5"></script> <![endif]-->
<script src="_static/doctools.js?v=9bcbadda"></script> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<script src="_static/searchtools.js"></script> <script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
@ -29,32 +26,26 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Raylib Python
<a href="index.html" class="icon icon-home">
Raylib Python
</a> </a>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get"> <form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" /> <input type="hidden" name="area" value="default" />
</form> </form>
</div> </div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p> <p class="caption"><span class="caption-text">Contents:</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 4.0.0</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#quickstart">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#installation">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#license-updated">License (updated)</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#performance">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#packaging-your-app">Packaging your app</a></li>
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li> <li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
@ -62,7 +53,6 @@
<li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li> <li class="toctree-l1"><a class="reference internal" href="raylib.html">C API</a></li>
<li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li> <li class="toctree-l1"><a class="reference internal" href="dynamic.html">Dynamic Bindings</a></li>
<li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li> <li class="toctree-l1"><a class="reference internal" href="BUILDING.html">Building from source</a></li>
<li class="toctree-l1"><a class="reference internal" href="RPI.html">Raspberry Pi</a></li>
</ul> </ul>
</div> </div>
@ -78,8 +68,8 @@
<div class="rst-content"> <div class="rst-content">
<div role="navigation" aria-label="Page navigation"> <div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li class="breadcrumb-item active">Search</li> <li>Search</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
</li> </li>
</ul> </ul>

File diff suppressed because one or more lines are too long

View file

@ -8,6 +8,4 @@ include raylib/*.so
include version.py include version.py
exclude raylib/*.a exclude raylib/*.a
exclude raylib/*.c exclude raylib/*.c
exclude raylib/*.o exclude raylib/*.o
include raylib/py.typed
include pyray/py.typed

View file

@ -13,7 +13,7 @@ CFFI ABI dynamic bindings avoid the need to compile a C extension module. They
Therefore I personally recommend the static ones. Therefore I personally recommend the static ones.
But the dynamic bindings have the advantage that you don't need to compile anything to install. You just need a Raylib DLL. But the dynamic bindings have the advantage that you don't need to compile anything to install. You just need a Raylib DLL.
The API is exactly the same as the static one documented here. (Therefore you can't have both modules installed at once.) The only difference is you can't do:: API is exactly the same as the static one documented here. (Therefore you can't have both modules installed at once.) The only difference is you can't do::
from raylib import * from raylib import *
@ -31,9 +31,6 @@ If you use the ``rl.`` prefix then code will work on both static and dynamic bin
If you access functions via ``import pyray`` then there is no difference at all, but be warned this hasn't been tested much. If you access functions via ``import pyray`` then there is no difference at all, but be warned this hasn't been tested much.
.. note::
Standard Raylib DLLs do not include additional libraries like Raygui, Physac, etc. So these functions won't work.
.. important:: .. important::

View file

@ -22,10 +22,9 @@ import itertools
import os import os
import pathlib import pathlib
import platform import platform
import logging
from .version import __version__ from .version import __version__
logger = logging.getLogger(__name__)
MODULE = pathlib.Path(__file__).parent MODULE = pathlib.Path(__file__).parent
def raylib_library_path(): def raylib_library_path():
@ -55,9 +54,9 @@ ffi.cdef(open(MODULE / "raylib_modified.h").read().replace('RLAPI ', ''))
try: try:
raylib_fname = raylib_library_path() raylib_fname = raylib_library_path()
rl = ffi.dlopen(raylib_fname) rl = ffi.dlopen(raylib_fname)
logger.warning('LOADED DYNAMICALLY SHARED LIB {} {}'.format(__version__, raylib_fname)) print('LOADED DYNAMICALLY SHARED LIB {} {}'.format(__version__, raylib_fname))
except Exception as e: except Exception as e:
logger.exception(e) print(e)
LIGHTGRAY =( 200, 200, 200, 255 ) LIGHTGRAY =( 200, 200, 200, 255 )
GRAY =( 130, 130, 130, 255 ) GRAY =( 130, 130, 130, 255 )

File diff suppressed because it is too large Load diff

View file

@ -1,508 +0,0 @@
import raylib
RAYLIB_VERSION_MAJOR: int = 5
RAYLIB_VERSION_MINOR: int = 5
RAYLIB_VERSION_PATCH: int = 0
RAYLIB_VERSION: str = "5.5"
PI: float = 3.141592653589793
DEG2RAD = PI / 180.0
RAD2DEG = 180.0 / PI
MOUSE_LEFT_BUTTON = raylib.MOUSE_BUTTON_LEFT
MOUSE_RIGHT_BUTTON = raylib.MOUSE_BUTTON_RIGHT
MOUSE_MIDDLE_BUTTON = raylib.MOUSE_BUTTON_MIDDLE
MATERIAL_MAP_DIFFUSE = raylib.MATERIAL_MAP_ALBEDO
MATERIAL_MAP_SPECULAR = raylib.MATERIAL_MAP_METALNESS
SHADER_LOC_MAP_DIFFUSE = raylib.SHADER_LOC_MAP_ALBEDO
SHADER_LOC_MAP_SPECULAR = raylib.SHADER_LOC_MAP_METALNESS
EPSILON: float = 1e-06
RLGL_VERSION: str = "5.0"
RL_DEFAULT_BATCH_BUFFER_ELEMENTS: int = 8192
RL_DEFAULT_BATCH_BUFFERS: int = 1
RL_DEFAULT_BATCH_DRAWCALLS: int = 256
RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS: int = 4
RL_MAX_MATRIX_STACK_SIZE: int = 32
RL_MAX_SHADER_LOCATIONS: int = 32
RL_TEXTURE_WRAP_S: int = 10242
RL_TEXTURE_WRAP_T: int = 10243
RL_TEXTURE_MAG_FILTER: int = 10240
RL_TEXTURE_MIN_FILTER: int = 10241
RL_TEXTURE_FILTER_NEAREST: int = 9728
RL_TEXTURE_FILTER_LINEAR: int = 9729
RL_TEXTURE_FILTER_MIP_NEAREST: int = 9984
RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR: int = 9986
RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST: int = 9985
RL_TEXTURE_FILTER_MIP_LINEAR: int = 9987
RL_TEXTURE_FILTER_ANISOTROPIC: int = 12288
RL_TEXTURE_MIPMAP_BIAS_RATIO: int = 16384
RL_TEXTURE_WRAP_REPEAT: int = 10497
RL_TEXTURE_WRAP_CLAMP: int = 33071
RL_TEXTURE_WRAP_MIRROR_REPEAT: int = 33648
RL_TEXTURE_WRAP_MIRROR_CLAMP: int = 34626
RL_MODELVIEW: int = 5888
RL_PROJECTION: int = 5889
RL_TEXTURE: int = 5890
RL_LINES: int = 1
RL_TRIANGLES: int = 4
RL_QUADS: int = 7
RL_UNSIGNED_BYTE: int = 5121
RL_FLOAT: int = 5126
RL_STREAM_DRAW: int = 35040
RL_STREAM_READ: int = 35041
RL_STREAM_COPY: int = 35042
RL_STATIC_DRAW: int = 35044
RL_STATIC_READ: int = 35045
RL_STATIC_COPY: int = 35046
RL_DYNAMIC_DRAW: int = 35048
RL_DYNAMIC_READ: int = 35049
RL_DYNAMIC_COPY: int = 35050
RL_FRAGMENT_SHADER: int = 35632
RL_VERTEX_SHADER: int = 35633
RL_COMPUTE_SHADER: int = 37305
RL_ZERO: int = 0
RL_ONE: int = 1
RL_SRC_COLOR: int = 768
RL_ONE_MINUS_SRC_COLOR: int = 769
RL_SRC_ALPHA: int = 770
RL_ONE_MINUS_SRC_ALPHA: int = 771
RL_DST_ALPHA: int = 772
RL_ONE_MINUS_DST_ALPHA: int = 773
RL_DST_COLOR: int = 774
RL_ONE_MINUS_DST_COLOR: int = 775
RL_SRC_ALPHA_SATURATE: int = 776
RL_CONSTANT_COLOR: int = 32769
RL_ONE_MINUS_CONSTANT_COLOR: int = 32770
RL_CONSTANT_ALPHA: int = 32771
RL_ONE_MINUS_CONSTANT_ALPHA: int = 32772
RL_FUNC_ADD: int = 32774
RL_MIN: int = 32775
RL_MAX: int = 32776
RL_FUNC_SUBTRACT: int = 32778
RL_FUNC_REVERSE_SUBTRACT: int = 32779
RL_BLEND_EQUATION: int = 32777
RL_BLEND_EQUATION_RGB: int = 32777
RL_BLEND_EQUATION_ALPHA: int = 34877
RL_BLEND_DST_RGB: int = 32968
RL_BLEND_SRC_RGB: int = 32969
RL_BLEND_DST_ALPHA: int = 32970
RL_BLEND_SRC_ALPHA: int = 32971
RL_BLEND_COLOR: int = 32773
RL_READ_FRAMEBUFFER: int = 36008
RL_DRAW_FRAMEBUFFER: int = 36009
RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION: int = 0
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD: int = 1
RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL: int = 2
RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR: int = 3
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT: int = 4
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2: int = 5
RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES: int = 6
RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS: int = 7
RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS: int = 8
RL_SHADER_LOC_MAP_DIFFUSE = raylib.RL_SHADER_LOC_MAP_ALBEDO
RL_SHADER_LOC_MAP_SPECULAR = raylib.RL_SHADER_LOC_MAP_METALNESS
GL_SHADING_LANGUAGE_VERSION: int = 35724
GL_COMPRESSED_RGB_S3TC_DXT1_EXT: int = 33776
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: int = 33777
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: int = 33778
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: int = 33779
GL_ETC1_RGB8_OES: int = 36196
GL_COMPRESSED_RGB8_ETC2: int = 37492
GL_COMPRESSED_RGBA8_ETC2_EAC: int = 37496
GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: int = 35840
GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: int = 35842
GL_COMPRESSED_RGBA_ASTC_4x4_KHR: int = 37808
GL_COMPRESSED_RGBA_ASTC_8x8_KHR: int = 37815
GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: int = 34047
GL_TEXTURE_MAX_ANISOTROPY_EXT: int = 34046
GL_PROGRAM_POINT_SIZE: int = 34370
GL_LINE_WIDTH: int = 2849
GL_UNSIGNED_SHORT_5_6_5: int = 33635
GL_UNSIGNED_SHORT_5_5_5_1: int = 32820
GL_UNSIGNED_SHORT_4_4_4_4: int = 32819
GL_LUMINANCE: int = 6409
GL_LUMINANCE_ALPHA: int = 6410
RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION: str = "vertexPosition"
RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD: str = "vertexTexCoord"
RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL: str = "vertexNormal"
RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR: str = "vertexColor"
RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT: str = "vertexTangent"
RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2: str = "vertexTexCoord2"
RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS: str = "vertexBoneIds"
RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS: str = "vertexBoneWeights"
RL_DEFAULT_SHADER_UNIFORM_NAME_MVP: str = "mvp"
RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW: str = "matView"
RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION: str = "matProjection"
RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL: str = "matModel"
RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL: str = "matNormal"
RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR: str = "colDiffuse"
RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES: str = "boneMatrices"
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0: str = "texture0"
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1: str = "texture1"
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2: str = "texture2"
RAYGUI_VERSION_MAJOR: int = 4
RAYGUI_VERSION_MINOR: int = 5
RAYGUI_VERSION_PATCH: int = 0
RAYGUI_VERSION: str = "4.5-dev"
SCROLLBAR_LEFT_SIDE: int = 0
SCROLLBAR_RIGHT_SIDE: int = 1
RAYGUI_ICON_SIZE: int = 16
RAYGUI_ICON_MAX_ICONS: int = 256
RAYGUI_ICON_MAX_NAME_LENGTH: int = 32
RAYGUI_MAX_CONTROLS: int = 16
RAYGUI_MAX_PROPS_BASE: int = 16
RAYGUI_MAX_PROPS_EXTENDED: int = 8
KEY_RIGHT: int = 262
KEY_LEFT: int = 263
KEY_DOWN: int = 264
KEY_UP: int = 265
KEY_BACKSPACE: int = 259
KEY_ENTER: int = 257
MOUSE_LEFT_BUTTON: int = 0
RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT: int = 24
RAYGUI_GROUPBOX_LINE_THICK: int = 1
RAYGUI_LINE_MARGIN_TEXT: int = 12
RAYGUI_LINE_TEXT_PADDING: int = 4
RAYGUI_PANEL_BORDER_WIDTH: int = 1
RAYGUI_TABBAR_ITEM_WIDTH: int = 160
RAYGUI_MIN_SCROLLBAR_WIDTH: int = 40
RAYGUI_MIN_SCROLLBAR_HEIGHT: int = 40
RAYGUI_MIN_MOUSE_WHEEL_SPEED: int = 20
RAYGUI_TOGGLEGROUP_MAX_ITEMS: int = 32
RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN: int = 40
RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY: int = 1
RAYGUI_VALUEBOX_MAX_CHARS: int = 32
RAYGUI_COLORBARALPHA_CHECKED_SIZE: int = 10
RAYGUI_MESSAGEBOX_BUTTON_HEIGHT: int = 24
RAYGUI_MESSAGEBOX_BUTTON_PADDING: int = 12
RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT: int = 24
RAYGUI_TEXTINPUTBOX_BUTTON_PADDING: int = 12
RAYGUI_TEXTINPUTBOX_HEIGHT: int = 26
RAYGUI_GRID_ALPHA: float = 0.15
MAX_LINE_BUFFER_SIZE: int = 256
ICON_TEXT_PADDING: int = 4
RAYGUI_MAX_TEXT_LINES: int = 128
RAYGUI_TEXTSPLIT_MAX_ITEMS: int = 128
RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE: int = 1024
RAYGUI_TEXTFORMAT_MAX_SIZE: int = 256
PHYSAC_MAX_BODIES: int = 64
PHYSAC_MAX_MANIFOLDS: int = 4096
PHYSAC_MAX_VERTICES: int = 24
PHYSAC_CIRCLE_VERTICES: int = 24
PHYSAC_COLLISION_ITERATIONS: int = 20
PHYSAC_PENETRATION_ALLOWANCE: float = 0.05
PHYSAC_PENETRATION_CORRECTION: float = 0.4
PHYSAC_FLT_MAX: float = 3.402823466e+38
PHYSAC_EPSILON: float = 1e-06
GLFW_VERSION_MAJOR: int = 3
GLFW_VERSION_MINOR: int = 4
GLFW_VERSION_REVISION: int = 0
GLFW_TRUE: int = 1
GLFW_FALSE: int = 0
GLFW_RELEASE: int = 0
GLFW_PRESS: int = 1
GLFW_REPEAT: int = 2
GLFW_HAT_CENTERED: int = 0
GLFW_HAT_UP: int = 1
GLFW_HAT_RIGHT: int = 2
GLFW_HAT_DOWN: int = 4
GLFW_HAT_LEFT: int = 8
GLFW_HAT_RIGHT_UP = GLFW_HAT_RIGHT | GLFW_HAT_UP
GLFW_HAT_RIGHT_DOWN = GLFW_HAT_RIGHT | GLFW_HAT_DOWN
GLFW_HAT_LEFT_UP = GLFW_HAT_LEFT | GLFW_HAT_UP
GLFW_HAT_LEFT_DOWN = GLFW_HAT_LEFT | GLFW_HAT_DOWN
GLFW_KEY_SPACE: int = 32
GLFW_KEY_APOSTROPHE: int = 39
GLFW_KEY_COMMA: int = 44
GLFW_KEY_MINUS: int = 45
GLFW_KEY_PERIOD: int = 46
GLFW_KEY_SLASH: int = 47
GLFW_KEY_0: int = 48
GLFW_KEY_1: int = 49
GLFW_KEY_2: int = 50
GLFW_KEY_3: int = 51
GLFW_KEY_4: int = 52
GLFW_KEY_5: int = 53
GLFW_KEY_6: int = 54
GLFW_KEY_7: int = 55
GLFW_KEY_8: int = 56
GLFW_KEY_9: int = 57
GLFW_KEY_SEMICOLON: int = 59
GLFW_KEY_EQUAL: int = 61
GLFW_KEY_A: int = 65
GLFW_KEY_B: int = 66
GLFW_KEY_C: int = 67
GLFW_KEY_D: int = 68
GLFW_KEY_E: int = 69
GLFW_KEY_F: int = 70
GLFW_KEY_G: int = 71
GLFW_KEY_H: int = 72
GLFW_KEY_I: int = 73
GLFW_KEY_J: int = 74
GLFW_KEY_K: int = 75
GLFW_KEY_L: int = 76
GLFW_KEY_M: int = 77
GLFW_KEY_N: int = 78
GLFW_KEY_O: int = 79
GLFW_KEY_P: int = 80
GLFW_KEY_Q: int = 81
GLFW_KEY_R: int = 82
GLFW_KEY_S: int = 83
GLFW_KEY_T: int = 84
GLFW_KEY_U: int = 85
GLFW_KEY_V: int = 86
GLFW_KEY_W: int = 87
GLFW_KEY_X: int = 88
GLFW_KEY_Y: int = 89
GLFW_KEY_Z: int = 90
GLFW_KEY_LEFT_BRACKET: int = 91
GLFW_KEY_BACKSLASH: int = 92
GLFW_KEY_RIGHT_BRACKET: int = 93
GLFW_KEY_GRAVE_ACCENT: int = 96
GLFW_KEY_WORLD_1: int = 161
GLFW_KEY_WORLD_2: int = 162
GLFW_KEY_ESCAPE: int = 256
GLFW_KEY_ENTER: int = 257
GLFW_KEY_TAB: int = 258
GLFW_KEY_BACKSPACE: int = 259
GLFW_KEY_INSERT: int = 260
GLFW_KEY_DELETE: int = 261
GLFW_KEY_RIGHT: int = 262
GLFW_KEY_LEFT: int = 263
GLFW_KEY_DOWN: int = 264
GLFW_KEY_UP: int = 265
GLFW_KEY_PAGE_UP: int = 266
GLFW_KEY_PAGE_DOWN: int = 267
GLFW_KEY_HOME: int = 268
GLFW_KEY_END: int = 269
GLFW_KEY_CAPS_LOCK: int = 280
GLFW_KEY_SCROLL_LOCK: int = 281
GLFW_KEY_NUM_LOCK: int = 282
GLFW_KEY_PRINT_SCREEN: int = 283
GLFW_KEY_PAUSE: int = 284
GLFW_KEY_F1: int = 290
GLFW_KEY_F2: int = 291
GLFW_KEY_F3: int = 292
GLFW_KEY_F4: int = 293
GLFW_KEY_F5: int = 294
GLFW_KEY_F6: int = 295
GLFW_KEY_F7: int = 296
GLFW_KEY_F8: int = 297
GLFW_KEY_F9: int = 298
GLFW_KEY_F10: int = 299
GLFW_KEY_F11: int = 300
GLFW_KEY_F12: int = 301
GLFW_KEY_F13: int = 302
GLFW_KEY_F14: int = 303
GLFW_KEY_F15: int = 304
GLFW_KEY_F16: int = 305
GLFW_KEY_F17: int = 306
GLFW_KEY_F18: int = 307
GLFW_KEY_F19: int = 308
GLFW_KEY_F20: int = 309
GLFW_KEY_F21: int = 310
GLFW_KEY_F22: int = 311
GLFW_KEY_F23: int = 312
GLFW_KEY_F24: int = 313
GLFW_KEY_F25: int = 314
GLFW_KEY_KP_0: int = 320
GLFW_KEY_KP_1: int = 321
GLFW_KEY_KP_2: int = 322
GLFW_KEY_KP_3: int = 323
GLFW_KEY_KP_4: int = 324
GLFW_KEY_KP_5: int = 325
GLFW_KEY_KP_6: int = 326
GLFW_KEY_KP_7: int = 327
GLFW_KEY_KP_8: int = 328
GLFW_KEY_KP_9: int = 329
GLFW_KEY_KP_DECIMAL: int = 330
GLFW_KEY_KP_DIVIDE: int = 331
GLFW_KEY_KP_MULTIPLY: int = 332
GLFW_KEY_KP_SUBTRACT: int = 333
GLFW_KEY_KP_ADD: int = 334
GLFW_KEY_KP_ENTER: int = 335
GLFW_KEY_KP_EQUAL: int = 336
GLFW_KEY_LEFT_SHIFT: int = 340
GLFW_KEY_LEFT_CONTROL: int = 341
GLFW_KEY_LEFT_ALT: int = 342
GLFW_KEY_LEFT_SUPER: int = 343
GLFW_KEY_RIGHT_SHIFT: int = 344
GLFW_KEY_RIGHT_CONTROL: int = 345
GLFW_KEY_RIGHT_ALT: int = 346
GLFW_KEY_RIGHT_SUPER: int = 347
GLFW_KEY_MENU: int = 348
GLFW_MOD_SHIFT: int = 1
GLFW_MOD_CONTROL: int = 2
GLFW_MOD_ALT: int = 4
GLFW_MOD_SUPER: int = 8
GLFW_MOD_CAPS_LOCK: int = 16
GLFW_MOD_NUM_LOCK: int = 32
GLFW_MOUSE_BUTTON_1: int = 0
GLFW_MOUSE_BUTTON_2: int = 1
GLFW_MOUSE_BUTTON_3: int = 2
GLFW_MOUSE_BUTTON_4: int = 3
GLFW_MOUSE_BUTTON_5: int = 4
GLFW_MOUSE_BUTTON_6: int = 5
GLFW_MOUSE_BUTTON_7: int = 6
GLFW_MOUSE_BUTTON_8: int = 7
GLFW_JOYSTICK_1: int = 0
GLFW_JOYSTICK_2: int = 1
GLFW_JOYSTICK_3: int = 2
GLFW_JOYSTICK_4: int = 3
GLFW_JOYSTICK_5: int = 4
GLFW_JOYSTICK_6: int = 5
GLFW_JOYSTICK_7: int = 6
GLFW_JOYSTICK_8: int = 7
GLFW_JOYSTICK_9: int = 8
GLFW_JOYSTICK_10: int = 9
GLFW_JOYSTICK_11: int = 10
GLFW_JOYSTICK_12: int = 11
GLFW_JOYSTICK_13: int = 12
GLFW_JOYSTICK_14: int = 13
GLFW_JOYSTICK_15: int = 14
GLFW_JOYSTICK_16: int = 15
GLFW_GAMEPAD_BUTTON_A: int = 0
GLFW_GAMEPAD_BUTTON_B: int = 1
GLFW_GAMEPAD_BUTTON_X: int = 2
GLFW_GAMEPAD_BUTTON_Y: int = 3
GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: int = 4
GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: int = 5
GLFW_GAMEPAD_BUTTON_BACK: int = 6
GLFW_GAMEPAD_BUTTON_START: int = 7
GLFW_GAMEPAD_BUTTON_GUIDE: int = 8
GLFW_GAMEPAD_BUTTON_LEFT_THUMB: int = 9
GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: int = 10
GLFW_GAMEPAD_BUTTON_DPAD_UP: int = 11
GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: int = 12
GLFW_GAMEPAD_BUTTON_DPAD_DOWN: int = 13
GLFW_GAMEPAD_BUTTON_DPAD_LEFT: int = 14
GLFW_GAMEPAD_AXIS_LEFT_X: int = 0
GLFW_GAMEPAD_AXIS_LEFT_Y: int = 1
GLFW_GAMEPAD_AXIS_RIGHT_X: int = 2
GLFW_GAMEPAD_AXIS_RIGHT_Y: int = 3
GLFW_GAMEPAD_AXIS_LEFT_TRIGGER: int = 4
GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER: int = 5
GLFW_NO_ERROR: int = 0
GLFW_NOT_INITIALIZED: int = 65537
GLFW_NO_CURRENT_CONTEXT: int = 65538
GLFW_INVALID_ENUM: int = 65539
GLFW_INVALID_VALUE: int = 65540
GLFW_OUT_OF_MEMORY: int = 65541
GLFW_API_UNAVAILABLE: int = 65542
GLFW_VERSION_UNAVAILABLE: int = 65543
GLFW_PLATFORM_ERROR: int = 65544
GLFW_FORMAT_UNAVAILABLE: int = 65545
GLFW_NO_WINDOW_CONTEXT: int = 65546
GLFW_CURSOR_UNAVAILABLE: int = 65547
GLFW_FEATURE_UNAVAILABLE: int = 65548
GLFW_FEATURE_UNIMPLEMENTED: int = 65549
GLFW_PLATFORM_UNAVAILABLE: int = 65550
GLFW_FOCUSED: int = 131073
GLFW_ICONIFIED: int = 131074
GLFW_RESIZABLE: int = 131075
GLFW_VISIBLE: int = 131076
GLFW_DECORATED: int = 131077
GLFW_AUTO_ICONIFY: int = 131078
GLFW_FLOATING: int = 131079
GLFW_MAXIMIZED: int = 131080
GLFW_CENTER_CURSOR: int = 131081
GLFW_TRANSPARENT_FRAMEBUFFER: int = 131082
GLFW_HOVERED: int = 131083
GLFW_FOCUS_ON_SHOW: int = 131084
GLFW_MOUSE_PASSTHROUGH: int = 131085
GLFW_POSITION_X: int = 131086
GLFW_POSITION_Y: int = 131087
GLFW_RED_BITS: int = 135169
GLFW_GREEN_BITS: int = 135170
GLFW_BLUE_BITS: int = 135171
GLFW_ALPHA_BITS: int = 135172
GLFW_DEPTH_BITS: int = 135173
GLFW_STENCIL_BITS: int = 135174
GLFW_ACCUM_RED_BITS: int = 135175
GLFW_ACCUM_GREEN_BITS: int = 135176
GLFW_ACCUM_BLUE_BITS: int = 135177
GLFW_ACCUM_ALPHA_BITS: int = 135178
GLFW_AUX_BUFFERS: int = 135179
GLFW_STEREO: int = 135180
GLFW_SAMPLES: int = 135181
GLFW_SRGB_CAPABLE: int = 135182
GLFW_REFRESH_RATE: int = 135183
GLFW_DOUBLEBUFFER: int = 135184
GLFW_CLIENT_API: int = 139265
GLFW_CONTEXT_VERSION_MAJOR: int = 139266
GLFW_CONTEXT_VERSION_MINOR: int = 139267
GLFW_CONTEXT_REVISION: int = 139268
GLFW_CONTEXT_ROBUSTNESS: int = 139269
GLFW_OPENGL_FORWARD_COMPAT: int = 139270
GLFW_CONTEXT_DEBUG: int = 139271
GLFW_OPENGL_PROFILE: int = 139272
GLFW_CONTEXT_RELEASE_BEHAVIOR: int = 139273
GLFW_CONTEXT_NO_ERROR: int = 139274
GLFW_CONTEXT_CREATION_API: int = 139275
GLFW_SCALE_TO_MONITOR: int = 139276
GLFW_SCALE_FRAMEBUFFER: int = 139277
GLFW_COCOA_RETINA_FRAMEBUFFER: int = 143361
GLFW_COCOA_FRAME_NAME: int = 143362
GLFW_COCOA_GRAPHICS_SWITCHING: int = 143363
GLFW_X11_CLASS_NAME: int = 147457
GLFW_X11_INSTANCE_NAME: int = 147458
GLFW_WIN32_KEYBOARD_MENU: int = 151553
GLFW_WIN32_SHOWDEFAULT: int = 151554
GLFW_WAYLAND_APP_ID: int = 155649
GLFW_NO_API: int = 0
GLFW_OPENGL_API: int = 196609
GLFW_OPENGL_ES_API: int = 196610
GLFW_NO_ROBUSTNESS: int = 0
GLFW_NO_RESET_NOTIFICATION: int = 200705
GLFW_LOSE_CONTEXT_ON_RESET: int = 200706
GLFW_OPENGL_ANY_PROFILE: int = 0
GLFW_OPENGL_CORE_PROFILE: int = 204801
GLFW_OPENGL_COMPAT_PROFILE: int = 204802
GLFW_CURSOR: int = 208897
GLFW_STICKY_KEYS: int = 208898
GLFW_STICKY_MOUSE_BUTTONS: int = 208899
GLFW_LOCK_KEY_MODS: int = 208900
GLFW_RAW_MOUSE_MOTION: int = 208901
GLFW_CURSOR_NORMAL: int = 212993
GLFW_CURSOR_HIDDEN: int = 212994
GLFW_CURSOR_DISABLED: int = 212995
GLFW_CURSOR_CAPTURED: int = 212996
GLFW_ANY_RELEASE_BEHAVIOR: int = 0
GLFW_RELEASE_BEHAVIOR_FLUSH: int = 217089
GLFW_RELEASE_BEHAVIOR_NONE: int = 217090
GLFW_NATIVE_CONTEXT_API: int = 221185
GLFW_EGL_CONTEXT_API: int = 221186
GLFW_OSMESA_CONTEXT_API: int = 221187
GLFW_ANGLE_PLATFORM_TYPE_NONE: int = 225281
GLFW_ANGLE_PLATFORM_TYPE_OPENGL: int = 225282
GLFW_ANGLE_PLATFORM_TYPE_OPENGLES: int = 225283
GLFW_ANGLE_PLATFORM_TYPE_D3D9: int = 225284
GLFW_ANGLE_PLATFORM_TYPE_D3D11: int = 225285
GLFW_ANGLE_PLATFORM_TYPE_VULKAN: int = 225287
GLFW_ANGLE_PLATFORM_TYPE_METAL: int = 225288
GLFW_WAYLAND_PREFER_LIBDECOR: int = 229377
GLFW_WAYLAND_DISABLE_LIBDECOR: int = 229378
GLFW_ANY_POSITION: int = 2147483648
GLFW_ARROW_CURSOR: int = 221185
GLFW_IBEAM_CURSOR: int = 221186
GLFW_CROSSHAIR_CURSOR: int = 221187
GLFW_POINTING_HAND_CURSOR: int = 221188
GLFW_RESIZE_EW_CURSOR: int = 221189
GLFW_RESIZE_NS_CURSOR: int = 221190
GLFW_RESIZE_NWSE_CURSOR: int = 221191
GLFW_RESIZE_NESW_CURSOR: int = 221192
GLFW_RESIZE_ALL_CURSOR: int = 221193
GLFW_NOT_ALLOWED_CURSOR: int = 221194
GLFW_CONNECTED: int = 262145
GLFW_DISCONNECTED: int = 262146
GLFW_JOYSTICK_HAT_BUTTONS: int = 327681
GLFW_ANGLE_PLATFORM_TYPE: int = 327682
GLFW_PLATFORM: int = 327683
GLFW_COCOA_CHDIR_RESOURCES: int = 331777
GLFW_COCOA_MENUBAR: int = 331778
GLFW_X11_XCB_VULKAN_SURFACE: int = 335873
GLFW_WAYLAND_LIBDECOR: int = 339969
GLFW_ANY_PLATFORM: int = 393216
GLFW_PLATFORM_WIN32: int = 393217
GLFW_PLATFORM_COCOA: int = 393218
GLFW_PLATFORM_WAYLAND: int = 393219
GLFW_PLATFORM_X11: int = 393220
GLFW_PLATFORM_NULL: int = 393221

View file

@ -1,7 +1,6 @@
from enum import IntEnum from enum import IntEnum
class ConfigFlags(IntEnum): class ConfigFlags(IntEnum):
"""System/Window config flags."""
FLAG_VSYNC_HINT = 64 FLAG_VSYNC_HINT = 64
FLAG_FULLSCREEN_MODE = 2 FLAG_FULLSCREEN_MODE = 2
FLAG_WINDOW_RESIZABLE = 4 FLAG_WINDOW_RESIZABLE = 4
@ -15,12 +14,10 @@ class ConfigFlags(IntEnum):
FLAG_WINDOW_TRANSPARENT = 16 FLAG_WINDOW_TRANSPARENT = 16
FLAG_WINDOW_HIGHDPI = 8192 FLAG_WINDOW_HIGHDPI = 8192
FLAG_WINDOW_MOUSE_PASSTHROUGH = 16384 FLAG_WINDOW_MOUSE_PASSTHROUGH = 16384
FLAG_BORDERLESS_WINDOWED_MODE = 32768
FLAG_MSAA_4X_HINT = 32 FLAG_MSAA_4X_HINT = 32
FLAG_INTERLACED_HINT = 65536 FLAG_INTERLACED_HINT = 65536
class TraceLogLevel(IntEnum): class TraceLogLevel(IntEnum):
"""Trace log level."""
LOG_ALL = 0 LOG_ALL = 0
LOG_TRACE = 1 LOG_TRACE = 1
LOG_DEBUG = 2 LOG_DEBUG = 2
@ -31,7 +28,6 @@ class TraceLogLevel(IntEnum):
LOG_NONE = 7 LOG_NONE = 7
class KeyboardKey(IntEnum): class KeyboardKey(IntEnum):
"""Keyboard keys (US keyboard layout)."""
KEY_NULL = 0 KEY_NULL = 0
KEY_APOSTROPHE = 39 KEY_APOSTROPHE = 39
KEY_COMMA = 44 KEY_COMMA = 44
@ -139,12 +135,11 @@ class KeyboardKey(IntEnum):
KEY_KP_ENTER = 335 KEY_KP_ENTER = 335
KEY_KP_EQUAL = 336 KEY_KP_EQUAL = 336
KEY_BACK = 4 KEY_BACK = 4
KEY_MENU = 5 KEY_MENU = 82
KEY_VOLUME_UP = 24 KEY_VOLUME_UP = 24
KEY_VOLUME_DOWN = 25 KEY_VOLUME_DOWN = 25
class MouseButton(IntEnum): class MouseButton(IntEnum):
"""Mouse buttons."""
MOUSE_BUTTON_LEFT = 0 MOUSE_BUTTON_LEFT = 0
MOUSE_BUTTON_RIGHT = 1 MOUSE_BUTTON_RIGHT = 1
MOUSE_BUTTON_MIDDLE = 2 MOUSE_BUTTON_MIDDLE = 2
@ -154,7 +149,6 @@ class MouseButton(IntEnum):
MOUSE_BUTTON_BACK = 6 MOUSE_BUTTON_BACK = 6
class MouseCursor(IntEnum): class MouseCursor(IntEnum):
"""Mouse cursor."""
MOUSE_CURSOR_DEFAULT = 0 MOUSE_CURSOR_DEFAULT = 0
MOUSE_CURSOR_ARROW = 1 MOUSE_CURSOR_ARROW = 1
MOUSE_CURSOR_IBEAM = 2 MOUSE_CURSOR_IBEAM = 2
@ -168,7 +162,6 @@ class MouseCursor(IntEnum):
MOUSE_CURSOR_NOT_ALLOWED = 10 MOUSE_CURSOR_NOT_ALLOWED = 10
class GamepadButton(IntEnum): class GamepadButton(IntEnum):
"""Gamepad buttons."""
GAMEPAD_BUTTON_UNKNOWN = 0 GAMEPAD_BUTTON_UNKNOWN = 0
GAMEPAD_BUTTON_LEFT_FACE_UP = 1 GAMEPAD_BUTTON_LEFT_FACE_UP = 1
GAMEPAD_BUTTON_LEFT_FACE_RIGHT = 2 GAMEPAD_BUTTON_LEFT_FACE_RIGHT = 2
@ -189,7 +182,6 @@ class GamepadButton(IntEnum):
GAMEPAD_BUTTON_RIGHT_THUMB = 17 GAMEPAD_BUTTON_RIGHT_THUMB = 17
class GamepadAxis(IntEnum): class GamepadAxis(IntEnum):
"""Gamepad axis."""
GAMEPAD_AXIS_LEFT_X = 0 GAMEPAD_AXIS_LEFT_X = 0
GAMEPAD_AXIS_LEFT_Y = 1 GAMEPAD_AXIS_LEFT_Y = 1
GAMEPAD_AXIS_RIGHT_X = 2 GAMEPAD_AXIS_RIGHT_X = 2
@ -198,7 +190,6 @@ class GamepadAxis(IntEnum):
GAMEPAD_AXIS_RIGHT_TRIGGER = 5 GAMEPAD_AXIS_RIGHT_TRIGGER = 5
class MaterialMapIndex(IntEnum): class MaterialMapIndex(IntEnum):
"""Material map index."""
MATERIAL_MAP_ALBEDO = 0 MATERIAL_MAP_ALBEDO = 0
MATERIAL_MAP_METALNESS = 1 MATERIAL_MAP_METALNESS = 1
MATERIAL_MAP_NORMAL = 2 MATERIAL_MAP_NORMAL = 2
@ -212,7 +203,6 @@ class MaterialMapIndex(IntEnum):
MATERIAL_MAP_BRDF = 10 MATERIAL_MAP_BRDF = 10
class ShaderLocationIndex(IntEnum): class ShaderLocationIndex(IntEnum):
"""Shader location index."""
SHADER_LOC_VERTEX_POSITION = 0 SHADER_LOC_VERTEX_POSITION = 0
SHADER_LOC_VERTEX_TEXCOORD01 = 1 SHADER_LOC_VERTEX_TEXCOORD01 = 1
SHADER_LOC_VERTEX_TEXCOORD02 = 2 SHADER_LOC_VERTEX_TEXCOORD02 = 2
@ -239,12 +229,8 @@ class ShaderLocationIndex(IntEnum):
SHADER_LOC_MAP_IRRADIANCE = 23 SHADER_LOC_MAP_IRRADIANCE = 23
SHADER_LOC_MAP_PREFILTER = 24 SHADER_LOC_MAP_PREFILTER = 24
SHADER_LOC_MAP_BRDF = 25 SHADER_LOC_MAP_BRDF = 25
SHADER_LOC_VERTEX_BONEIDS = 26
SHADER_LOC_VERTEX_BONEWEIGHTS = 27
SHADER_LOC_BONE_MATRICES = 28
class ShaderUniformDataType(IntEnum): class ShaderUniformDataType(IntEnum):
"""Shader uniform data type."""
SHADER_UNIFORM_FLOAT = 0 SHADER_UNIFORM_FLOAT = 0
SHADER_UNIFORM_VEC2 = 1 SHADER_UNIFORM_VEC2 = 1
SHADER_UNIFORM_VEC3 = 2 SHADER_UNIFORM_VEC3 = 2
@ -256,14 +242,12 @@ class ShaderUniformDataType(IntEnum):
SHADER_UNIFORM_SAMPLER2D = 8 SHADER_UNIFORM_SAMPLER2D = 8
class ShaderAttributeDataType(IntEnum): class ShaderAttributeDataType(IntEnum):
"""Shader attribute data types."""
SHADER_ATTRIB_FLOAT = 0 SHADER_ATTRIB_FLOAT = 0
SHADER_ATTRIB_VEC2 = 1 SHADER_ATTRIB_VEC2 = 1
SHADER_ATTRIB_VEC3 = 2 SHADER_ATTRIB_VEC3 = 2
SHADER_ATTRIB_VEC4 = 3 SHADER_ATTRIB_VEC4 = 3
class PixelFormat(IntEnum): class PixelFormat(IntEnum):
"""Pixel formats."""
PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1 PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1
PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA = 2 PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA = 2
PIXELFORMAT_UNCOMPRESSED_R5G6B5 = 3 PIXELFORMAT_UNCOMPRESSED_R5G6B5 = 3
@ -274,23 +258,19 @@ class PixelFormat(IntEnum):
PIXELFORMAT_UNCOMPRESSED_R32 = 8 PIXELFORMAT_UNCOMPRESSED_R32 = 8
PIXELFORMAT_UNCOMPRESSED_R32G32B32 = 9 PIXELFORMAT_UNCOMPRESSED_R32G32B32 = 9
PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 = 10 PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 = 10
PIXELFORMAT_UNCOMPRESSED_R16 = 11 PIXELFORMAT_COMPRESSED_DXT1_RGB = 11
PIXELFORMAT_UNCOMPRESSED_R16G16B16 = 12 PIXELFORMAT_COMPRESSED_DXT1_RGBA = 12
PIXELFORMAT_UNCOMPRESSED_R16G16B16A16 = 13 PIXELFORMAT_COMPRESSED_DXT3_RGBA = 13
PIXELFORMAT_COMPRESSED_DXT1_RGB = 14 PIXELFORMAT_COMPRESSED_DXT5_RGBA = 14
PIXELFORMAT_COMPRESSED_DXT1_RGBA = 15 PIXELFORMAT_COMPRESSED_ETC1_RGB = 15
PIXELFORMAT_COMPRESSED_DXT3_RGBA = 16 PIXELFORMAT_COMPRESSED_ETC2_RGB = 16
PIXELFORMAT_COMPRESSED_DXT5_RGBA = 17 PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 17
PIXELFORMAT_COMPRESSED_ETC1_RGB = 18 PIXELFORMAT_COMPRESSED_PVRT_RGB = 18
PIXELFORMAT_COMPRESSED_ETC2_RGB = 19 PIXELFORMAT_COMPRESSED_PVRT_RGBA = 19
PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 20 PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 20
PIXELFORMAT_COMPRESSED_PVRT_RGB = 21 PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 21
PIXELFORMAT_COMPRESSED_PVRT_RGBA = 22
PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 23
PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 24
class TextureFilter(IntEnum): class TextureFilter(IntEnum):
"""Texture parameters: filter mode."""
TEXTURE_FILTER_POINT = 0 TEXTURE_FILTER_POINT = 0
TEXTURE_FILTER_BILINEAR = 1 TEXTURE_FILTER_BILINEAR = 1
TEXTURE_FILTER_TRILINEAR = 2 TEXTURE_FILTER_TRILINEAR = 2
@ -299,28 +279,25 @@ class TextureFilter(IntEnum):
TEXTURE_FILTER_ANISOTROPIC_16X = 5 TEXTURE_FILTER_ANISOTROPIC_16X = 5
class TextureWrap(IntEnum): class TextureWrap(IntEnum):
"""Texture parameters: wrap mode."""
TEXTURE_WRAP_REPEAT = 0 TEXTURE_WRAP_REPEAT = 0
TEXTURE_WRAP_CLAMP = 1 TEXTURE_WRAP_CLAMP = 1
TEXTURE_WRAP_MIRROR_REPEAT = 2 TEXTURE_WRAP_MIRROR_REPEAT = 2
TEXTURE_WRAP_MIRROR_CLAMP = 3 TEXTURE_WRAP_MIRROR_CLAMP = 3
class CubemapLayout(IntEnum): class CubemapLayout(IntEnum):
"""Cubemap layouts."""
CUBEMAP_LAYOUT_AUTO_DETECT = 0 CUBEMAP_LAYOUT_AUTO_DETECT = 0
CUBEMAP_LAYOUT_LINE_VERTICAL = 1 CUBEMAP_LAYOUT_LINE_VERTICAL = 1
CUBEMAP_LAYOUT_LINE_HORIZONTAL = 2 CUBEMAP_LAYOUT_LINE_HORIZONTAL = 2
CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR = 3 CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR = 3
CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE = 4 CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE = 4
CUBEMAP_LAYOUT_PANORAMA = 5
class FontType(IntEnum): class FontType(IntEnum):
"""Font type, defines generation method."""
FONT_DEFAULT = 0 FONT_DEFAULT = 0
FONT_BITMAP = 1 FONT_BITMAP = 1
FONT_SDF = 2 FONT_SDF = 2
class BlendMode(IntEnum): class BlendMode(IntEnum):
"""Color blending modes (pre-defined)."""
BLEND_ALPHA = 0 BLEND_ALPHA = 0
BLEND_ADDITIVE = 1 BLEND_ADDITIVE = 1
BLEND_MULTIPLIED = 2 BLEND_MULTIPLIED = 2
@ -328,10 +305,8 @@ class BlendMode(IntEnum):
BLEND_SUBTRACT_COLORS = 4 BLEND_SUBTRACT_COLORS = 4
BLEND_ALPHA_PREMULTIPLY = 5 BLEND_ALPHA_PREMULTIPLY = 5
BLEND_CUSTOM = 6 BLEND_CUSTOM = 6
BLEND_CUSTOM_SEPARATE = 7
class Gesture(IntEnum): class Gesture(IntEnum):
"""Gesture."""
GESTURE_NONE = 0 GESTURE_NONE = 0
GESTURE_TAP = 1 GESTURE_TAP = 1
GESTURE_DOUBLETAP = 2 GESTURE_DOUBLETAP = 2
@ -345,7 +320,6 @@ class Gesture(IntEnum):
GESTURE_PINCH_OUT = 512 GESTURE_PINCH_OUT = 512
class CameraMode(IntEnum): class CameraMode(IntEnum):
"""Camera system modes."""
CAMERA_CUSTOM = 0 CAMERA_CUSTOM = 0
CAMERA_FREE = 1 CAMERA_FREE = 1
CAMERA_ORBITAL = 2 CAMERA_ORBITAL = 2
@ -353,43 +327,26 @@ class CameraMode(IntEnum):
CAMERA_THIRD_PERSON = 4 CAMERA_THIRD_PERSON = 4
class CameraProjection(IntEnum): class CameraProjection(IntEnum):
"""Camera projection."""
CAMERA_PERSPECTIVE = 0 CAMERA_PERSPECTIVE = 0
CAMERA_ORTHOGRAPHIC = 1 CAMERA_ORTHOGRAPHIC = 1
class NPatchLayout(IntEnum): class NPatchLayout(IntEnum):
"""N-patch layout."""
NPATCH_NINE_PATCH = 0 NPATCH_NINE_PATCH = 0
NPATCH_THREE_PATCH_VERTICAL = 1 NPATCH_THREE_PATCH_VERTICAL = 1
NPATCH_THREE_PATCH_HORIZONTAL = 2 NPATCH_THREE_PATCH_HORIZONTAL = 2
class GuiState(IntEnum): class GuiState(IntEnum):
"""Gui control state."""
STATE_NORMAL = 0 STATE_NORMAL = 0
STATE_FOCUSED = 1 STATE_FOCUSED = 1
STATE_PRESSED = 2 STATE_PRESSED = 2
STATE_DISABLED = 3 STATE_DISABLED = 3
class GuiTextAlignment(IntEnum): class GuiTextAlignment(IntEnum):
"""Gui control text alignment."""
TEXT_ALIGN_LEFT = 0 TEXT_ALIGN_LEFT = 0
TEXT_ALIGN_CENTER = 1 TEXT_ALIGN_CENTER = 1
TEXT_ALIGN_RIGHT = 2 TEXT_ALIGN_RIGHT = 2
class GuiTextAlignmentVertical(IntEnum):
"""Gui control text alignment vertical."""
TEXT_ALIGN_TOP = 0
TEXT_ALIGN_MIDDLE = 1
TEXT_ALIGN_BOTTOM = 2
class GuiTextWrapMode(IntEnum):
"""Gui control text wrap mode."""
TEXT_WRAP_NONE = 0
TEXT_WRAP_CHAR = 1
TEXT_WRAP_WORD = 2
class GuiControl(IntEnum): class GuiControl(IntEnum):
"""Gui controls."""
DEFAULT = 0 DEFAULT = 0
LABEL = 1 LABEL = 1
BUTTON = 2 BUTTON = 2
@ -408,7 +365,6 @@ class GuiControl(IntEnum):
STATUSBAR = 15 STATUSBAR = 15
class GuiControlProperty(IntEnum): class GuiControlProperty(IntEnum):
"""Gui base properties for every control."""
BORDER_COLOR_NORMAL = 0 BORDER_COLOR_NORMAL = 0
BASE_COLOR_NORMAL = 1 BASE_COLOR_NORMAL = 1
TEXT_COLOR_NORMAL = 2 TEXT_COLOR_NORMAL = 2
@ -424,32 +380,25 @@ class GuiControlProperty(IntEnum):
BORDER_WIDTH = 12 BORDER_WIDTH = 12
TEXT_PADDING = 13 TEXT_PADDING = 13
TEXT_ALIGNMENT = 14 TEXT_ALIGNMENT = 14
RESERVED = 15
class GuiDefaultProperty(IntEnum): class GuiDefaultProperty(IntEnum):
"""DEFAULT extended properties."""
TEXT_SIZE = 16 TEXT_SIZE = 16
TEXT_SPACING = 17 TEXT_SPACING = 17
LINE_COLOR = 18 LINE_COLOR = 18
BACKGROUND_COLOR = 19 BACKGROUND_COLOR = 19
TEXT_LINE_SPACING = 20
TEXT_ALIGNMENT_VERTICAL = 21
TEXT_WRAP_MODE = 22
class GuiToggleProperty(IntEnum): class GuiToggleProperty(IntEnum):
"""Toggle/ToggleGroup."""
GROUP_PADDING = 16 GROUP_PADDING = 16
class GuiSliderProperty(IntEnum): class GuiSliderProperty(IntEnum):
"""Slider/SliderBar."""
SLIDER_WIDTH = 16 SLIDER_WIDTH = 16
SLIDER_PADDING = 17 SLIDER_PADDING = 17
class GuiProgressBarProperty(IntEnum): class GuiProgressBarProperty(IntEnum):
"""ProgressBar."""
PROGRESS_PADDING = 16 PROGRESS_PADDING = 16
class GuiScrollBarProperty(IntEnum): class GuiScrollBarProperty(IntEnum):
"""ScrollBar."""
ARROWS_SIZE = 16 ARROWS_SIZE = 16
ARROWS_VISIBLE = 17 ARROWS_VISIBLE = 17
SCROLL_SLIDER_PADDING = 18 SCROLL_SLIDER_PADDING = 18
@ -458,40 +407,31 @@ class GuiScrollBarProperty(IntEnum):
SCROLL_SPEED = 21 SCROLL_SPEED = 21
class GuiCheckBoxProperty(IntEnum): class GuiCheckBoxProperty(IntEnum):
"""CheckBox."""
CHECK_PADDING = 16 CHECK_PADDING = 16
class GuiComboBoxProperty(IntEnum): class GuiComboBoxProperty(IntEnum):
"""ComboBox."""
COMBO_BUTTON_WIDTH = 16 COMBO_BUTTON_WIDTH = 16
COMBO_BUTTON_SPACING = 17 COMBO_BUTTON_SPACING = 17
class GuiDropdownBoxProperty(IntEnum): class GuiDropdownBoxProperty(IntEnum):
"""DropdownBox."""
ARROW_PADDING = 16 ARROW_PADDING = 16
DROPDOWN_ITEMS_SPACING = 17 DROPDOWN_ITEMS_SPACING = 17
DROPDOWN_ARROW_HIDDEN = 18
DROPDOWN_ROLL_UP = 19
class GuiTextBoxProperty(IntEnum): class GuiTextBoxProperty(IntEnum):
"""TextBox/TextBoxMulti/ValueBox/Spinner.""" TEXT_INNER_PADDING = 16
TEXT_READONLY = 16 TEXT_LINES_SPACING = 17
class GuiSpinnerProperty(IntEnum): class GuiSpinnerProperty(IntEnum):
"""Spinner."""
SPIN_BUTTON_WIDTH = 16 SPIN_BUTTON_WIDTH = 16
SPIN_BUTTON_SPACING = 17 SPIN_BUTTON_SPACING = 17
class GuiListViewProperty(IntEnum): class GuiListViewProperty(IntEnum):
"""ListView."""
LIST_ITEMS_HEIGHT = 16 LIST_ITEMS_HEIGHT = 16
LIST_ITEMS_SPACING = 17 LIST_ITEMS_SPACING = 17
SCROLLBAR_WIDTH = 18 SCROLLBAR_WIDTH = 18
SCROLLBAR_SIDE = 19 SCROLLBAR_SIDE = 19
LIST_ITEMS_BORDER_WIDTH = 20
class GuiColorPickerProperty(IntEnum): class GuiColorPickerProperty(IntEnum):
"""ColorPicker."""
COLOR_SELECTOR_SIZE = 16 COLOR_SELECTOR_SIZE = 16
HUEBAR_WIDTH = 17 HUEBAR_WIDTH = 17
HUEBAR_PADDING = 18 HUEBAR_PADDING = 18
@ -499,7 +439,6 @@ class GuiColorPickerProperty(IntEnum):
HUEBAR_SELECTOR_OVERFLOW = 20 HUEBAR_SELECTOR_OVERFLOW = 20
class GuiIconName(IntEnum): class GuiIconName(IntEnum):
"""."""
ICON_NONE = 0 ICON_NONE = 0
ICON_FOLDER_FILE_OPEN = 1 ICON_FOLDER_FILE_OPEN = 1
ICON_FILE_SAVE_CLASSIC = 2 ICON_FILE_SAVE_CLASSIC = 2
@ -706,29 +645,29 @@ class GuiIconName(IntEnum):
ICON_FILE_NEW = 203 ICON_FILE_NEW = 203
ICON_FOLDER_ADD = 204 ICON_FOLDER_ADD = 204
ICON_ALARM = 205 ICON_ALARM = 205
ICON_CPU = 206 ICON_206 = 206
ICON_ROM = 207 ICON_207 = 207
ICON_STEP_OVER = 208 ICON_208 = 208
ICON_STEP_INTO = 209 ICON_209 = 209
ICON_STEP_OUT = 210 ICON_210 = 210
ICON_RESTART = 211 ICON_211 = 211
ICON_BREAKPOINT_ON = 212 ICON_212 = 212
ICON_BREAKPOINT_OFF = 213 ICON_213 = 213
ICON_BURGER_MENU = 214 ICON_214 = 214
ICON_CASE_SENSITIVE = 215 ICON_215 = 215
ICON_REG_EXP = 216 ICON_216 = 216
ICON_FOLDER = 217 ICON_217 = 217
ICON_FILE = 218 ICON_218 = 218
ICON_SAND_TIMER = 219 ICON_219 = 219
ICON_WARNING = 220 ICON_220 = 220
ICON_HELP_BOX = 221 ICON_221 = 221
ICON_INFO_BOX = 222 ICON_222 = 222
ICON_PRIORITY = 223 ICON_223 = 223
ICON_LAYERS_ISO = 224 ICON_224 = 224
ICON_LAYERS2 = 225 ICON_225 = 225
ICON_MLAYERS = 226 ICON_226 = 226
ICON_MAPS = 227 ICON_227 = 227
ICON_HOT = 228 ICON_228 = 228
ICON_229 = 229 ICON_229 = 229
ICON_230 = 230 ICON_230 = 230
ICON_231 = 231 ICON_231 = 231

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1 +0,0 @@
../../raylib/raylib.h.modified

File diff suppressed because it is too large Load diff

View file

@ -17,9 +17,10 @@ print(model.materials) # SHOULD BE A pointer to a 'struct Material' but some is
model.materials.maps[rl.MATERIAL_MAP_ALBEDO].texture = texture model.materials.maps[rl.MATERIAL_MAP_ALBEDO].texture = texture
rl.UnloadImage(image) rl.UnloadImage(image)
rl.SetCameraMode(camera[0], rl.CAMERA_ORBITAL)
while not rl.WindowShouldClose(): while not rl.WindowShouldClose():
rl.UpdateCamera(camera, rl.CAMERA_ORBITAL) rl.UpdateCamera(camera)
rl.BeginDrawing() rl.BeginDrawing()
rl.ClearBackground(colors.RAYWHITE) rl.ClearBackground(colors.RAYWHITE)
rl.BeginMode3D(camera[0]) rl.BeginMode3D(camera[0])

View file

@ -19,13 +19,14 @@ model = pr.load_model_from_mesh(mesh)
model.materials.maps[pr.MATERIAL_MAP_ALBEDO].texture = texture model.materials.maps[pr.MATERIAL_MAP_ALBEDO].texture = texture
pr.unload_image(image) pr.unload_image(image)
pr.set_camera_mode(camera, pr.CAMERA_ORBITAL)
pos = pr.get_mouse_position() pos = pr.get_mouse_position()
ray = pr.get_screen_to_world_ray(pos, camera) ray = pr.get_mouse_ray(pos, camera)
while not pr.window_should_close(): while not pr.window_should_close():
pr.update_camera(camera, pr.CAMERA_ORBITAL) pr.update_camera(camera)
pr.begin_drawing() pr.begin_drawing()
pr.clear_background(pr.RAYWHITE) pr.clear_background(pr.RAYWHITE)
pr.begin_mode_3d(camera) pr.begin_mode_3d(camera)
@ -36,6 +37,6 @@ while not pr.window_should_close():
pr.end_drawing() pr.end_drawing()
pos = pr.get_mouse_position() pos = pr.get_mouse_position()
ray = pr.get_screen_to_world_ray(pos, camera) ray = pr.get_mouse_ray(pos, camera)
pr.close_window() pr.close_window()

View file

@ -1,151 +0,0 @@
"""
raylib [audio] example - playing
"""
import dataclasses
import pyray
import raylib as rl
MAX_CIRCLES=64
@dataclasses.dataclass
class CircleWave:
position: pyray.Vector2
radius: float
alpha: float
speed: float
color: pyray.Color
screenWidth = 800
screenHeight = 450
rl.SetConfigFlags(rl.FLAG_MSAA_4X_HINT) # NOTE: Try to enable MSAA 4X
rl.InitWindow(screenWidth, screenHeight, b"raylib [audio] example - module playing (streaming)")
rl.InitAudioDevice() # Initialize audio device
colors = [pyray.ORANGE, pyray.RED, pyray.GOLD, pyray.LIME, pyray.BLUE, pyray.VIOLET, pyray.BROWN, pyray.LIGHTGRAY, pyray.PINK,
pyray.YELLOW, pyray.GREEN, pyray.SKYBLUE, pyray.PURPLE, pyray.BEIGE]
# Creates some circles for visual effect
circles = []
for i in range(MAX_CIRCLES):
rad = rl.GetRandomValue(10, 40)
pos = pyray.Vector2(
float(rl.GetRandomValue(rad, int(screenWidth) - rad)),
float(rl.GetRandomValue(rad, int(screenHeight) - rad))
)
c = CircleWave(
alpha=0.0,
radius=float(rad),
position=pos,
speed=float(rl.GetRandomValue(1, 100))/2000.0,
color=colors[rl.GetRandomValue(0, 13)]
)
circles.append(c)
music = rl.LoadMusicStream(b"resources/mini1111.xm")
music.looping = False
pitch = 1.0
rl.PlayMusicStream(music)
timePlayed = 0.0
pause = False
rl.SetTargetFPS(60) # Set our game to run at 60 frames-per-second
# Main game loop
while not rl.WindowShouldClose(): # Detect window close button or ESC key
# Update
#----------------------------------------------------------------------------------
rl.UpdateMusicStream(music) # Update music buffer with new stream data
# Restart music playing (stop and play)
if rl.IsKeyPressed(rl.KEY_SPACE):
rl.StopMusicStream(music)
rl.PlayMusicStream(music)
pause = False
# Pause/Resume music playing
if rl.IsKeyPressed(rl.KEY_P):
pause = not pause
if pause:
rl.PauseMusicStream(music)
else:
rl.ResumeMusicStream(music)
if rl.IsKeyDown(rl.KEY_DOWN):
pitch -= 0.01
elif rl.IsKeyDown(rl.KEY_UP):
pitch += 0.01
rl.SetMusicPitch(music, pitch)
# Get timePlayed scaled to bar dimensions
timePlayed = (rl.GetMusicTimePlayed(music) / rl.GetMusicTimeLength(music))*(screenWidth - 40)
# Color circles animation
for i in range(MAX_CIRCLES):
if pause:
break
circles[i].alpha += circles[i].speed
circles[i].radius += circles[i].speed*10.0
if circles[i].alpha > 1.0:
circles[i].speed *= -1
if circles[i].alpha <= 0.0:
circles[i].alpha = 0.0
rad = rl.GetRandomValue(10, 40)
pos = pyray.Vector2(
float(rl.GetRandomValue(rad, int(screenWidth) - rad)),
float(rl.GetRandomValue(rad, int(screenHeight) - rad))
)
circles[i].position = pos
circles[i].radius = float(rad)
circles[i].speed = float(rl.GetRandomValue(1, 100)) / 2000.0
circles[i].color = colors[rl.GetRandomValue(0, 13)]
#----------------------------------------------------------------------------------
# Draw
#----------------------------------------------------------------------------------
pyray.begin_drawing()
pyray.clear_background(pyray.RAYWHITE)
for i in range(MAX_CIRCLES):
pyray.draw_circle_v(circles[i].position, circles[i].radius, pyray.fade(circles[i].color, circles[i].alpha))
# Draw time bar
pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.LIGHTGRAY)
pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, pyray.MAROON)
pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.GRAY)
# Draw help instructions
pyray.draw_rectangle(20, 20, 425, 145, pyray.RAYWHITE)
pyray.draw_rectangle_lines(20, 20, 425, 145, pyray.GRAY)
pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, pyray.BLACK)
pyray.draw_text("PRESS P TO PAUSE/RESUME", 40, 70, 20, pyray.BLACK)
pyray.draw_text("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, pyray.BLACK)
pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, pyray.MAROON)
pyray.end_drawing()
#----------------------------------------------------------------------------------
# De-Initialization
#--------------------------------------------------------------------------------------
rl.UnloadMusicStream(music) # Unload music stream buffers from RAM
rl.CloseAudioDevice() # Close audio device (music streaming is automatically stopped)
rl.CloseWindow() # Close window and OpenGL context

View file

@ -1,101 +0,0 @@
"""checked with raylib-python-cffi 5.5.0.2
raylib [audio] example - Music playing (streaming)
Example complexity rating: [] 1/4
Example originally created with raylib 1.3, last time updated with raylib 4.0
Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
BSD-like license that allows static linking with closed source software
Copyright (c) 2015-2025 Ramon Santamaria (@raysan5)
This source has been converted from C raylib examples to Python.
"""
import pyray as rl
from pathlib import Path
THIS_DIR = Path(__file__).resolve().parent
# ------------------------------------------------------------------------------------
# Program main entry point
# ------------------------------------------------------------------------------------
def main():
# Initialization
# --------------------------------------------------------------------------------------
screen_width = 800
screen_height = 450
rl.init_window(
screen_width,
screen_height,
"raylib [audio] example - music playing (streaming)",
)
rl.init_audio_device() # Initialize audio device
music = rl.load_music_stream(str(THIS_DIR / "resources/country.mp3"))
rl.play_music_stream(music)
time_played = 0.0 # Time played normalized [0.0f..1.0f]
pause = False # Music playing paused
rl.set_target_fps(30) # Set our game to run at 30 frames-per-second
# --------------------------------------------------------------------------------------
# Main game loop
while not rl.window_should_close(): # Detect window close button or ESC key
# Update
# ----------------------------------------------------------------------------------
rl.update_music_stream(music) # Update music buffer with new stream data
# Restart music playing (stop and play)
if rl.is_key_pressed(rl.KEY_SPACE):
rl.stop_music_stream(music)
rl.play_music_stream(music)
# Pause/Resume music playing
if rl.is_key_pressed(rl.KEY_P):
pause = not pause
if pause:
rl.pause_music_stream(music)
else:
rl.resume_music_stream(music)
# Get normalized time played for current music stream
time_played = rl.get_music_time_played(music) / rl.get_music_time_length(music)
if time_played > 1.0:
time_played = 1.0 # Make sure time played is no longer than music
# ----------------------------------------------------------------------------------
# Draw
# ----------------------------------------------------------------------------------
rl.begin_drawing()
rl.clear_background(rl.RAYWHITE)
rl.draw_text("MUSIC SHOULD BE PLAYING!", 255, 150, 20, rl.LIGHTGRAY)
rl.draw_rectangle(200, 200, 400, 12, rl.LIGHTGRAY)
rl.draw_rectangle(200, 200, int(time_played * 400.0), 12, rl.MAROON)
rl.draw_rectangle_lines(200, 200, 400, 12, rl.GRAY)
rl.draw_text("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, rl.LIGHTGRAY)
rl.draw_text("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, rl.LIGHTGRAY)
rl.end_drawing()
# ----------------------------------------------------------------------------------
# De-Initialization
# --------------------------------------------------------------------------------------
rl.unload_music_stream(music) # Unload music stream buffers from RAM
rl.close_audio_device() # Close audio device (music streaming is automatically stopped)
rl.close_window() # Close window and OpenGL context
# --------------------------------------------------------------------------------------
if __name__ == "__main__":
main()

View file

@ -1,67 +0,0 @@
"""checked with raylib-python-cffi 5.5.0.2
raylib [audio] example - Sound loading and playing
Example complexity rating: [] 1/4
Example originally created with raylib 1.1, last time updated with raylib 3.5
Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
BSD-like license that allows static linking with closed source software
Copyright (c) 2014-2025 Ramon Santamaria (@raysan5)
This source has been converted from C raylib examples to Python.
"""
import pyray as rl
from pathlib import Path
# Get the directory where this script is located
THIS_DIR = Path(__file__).resolve().parent
# Initialization
# --------------------------------------------------------------------------------------
screen_width = 800
screen_height = 450
rl.init_window(
screen_width, screen_height, "raylib [audio] example - sound loading and playing"
)
rl.init_audio_device() # Initialize audio device
# Load WAV audio file using proper path resolution
fx_wav = rl.load_sound(str(THIS_DIR / "resources/sound.wav"))
# Load OGG audio file using proper path resolution
fx_ogg = rl.load_sound(str(THIS_DIR / "resources/target.ogg"))
rl.set_target_fps(60) # Set our game to run at 60 frames-per-second
# --------------------------------------------------------------------------------------
# Main game loop
while not rl.window_should_close(): # Detect window close button or ESC key
# Update
# ----------------------------------------------------------------------------------
if rl.is_key_pressed(rl.KeyboardKey.KEY_SPACE):
rl.play_sound(fx_wav) # Play WAV sound
if rl.is_key_pressed(rl.KeyboardKey.KEY_ENTER):
rl.play_sound(fx_ogg) # Play OGG sound
# ----------------------------------------------------------------------------------
# Draw
# ----------------------------------------------------------------------------------
rl.begin_drawing()
rl.clear_background(rl.RAYWHITE)
rl.draw_text("Press SPACE to PLAY the WAV sound!", 200, 180, 20, rl.LIGHTGRAY)
rl.draw_text("Press ENTER to PLAY the OGG sound!", 200, 220, 20, rl.LIGHTGRAY)
rl.end_drawing()
# ----------------------------------------------------------------------------------
# De-Initialization
# --------------------------------------------------------------------------------------
rl.unload_sound(fx_wav) # Unload sound data
rl.unload_sound(fx_ogg) # Unload sound data
rl.close_audio_device() # Close audio device
rl.close_window() # Close window and OpenGL context
# --------------------------------------------------------------------------------------

View file

@ -1,86 +0,0 @@
"""checked with raylib-python-cffi 5.5.0.2
raylib [audio] example - Playing sound multiple times
Example complexity rating: [] 2/4
Example originally created with raylib 4.6, last time updated with raylib 4.6
Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5)
Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
BSD-like license that allows static linking with closed source software
Copyright (c) 2023-2025 Jeffery Myers (@JeffM2501)
This source has been converted from C raylib examples to Python.
"""
from typing import List
import pyray as rl
from pathlib import Path
# Get the directory where this script is located
THIS_DIR = Path(__file__).resolve().parent
MAX_SOUNDS = 10
sound_array: List[rl.Sound] = []
current_sound = 0
# Initialization
# --------------------------------------------------------------------------------------
screen_width = 800
screen_height = 450
rl.init_window(
screen_width, screen_height, "raylib [audio] example - playing sound multiple times"
)
rl.init_audio_device() # Initialize audio device
# Load the sound list
sound_array.append(
rl.load_sound(str(THIS_DIR / "resources/sound.wav"))
) # Load WAV audio file into the first slot as the 'source' sound
# this sound owns the sample data
for i in range(1, MAX_SOUNDS):
sound_array.append(
rl.load_sound_alias(sound_array[0])
) # Load an alias of the sound into slots 1-9
# These do not own the sound data, but can be played
current_sound = 0 # Set the sound list to the start
rl.set_target_fps(60) # Set our game to run at 60 frames-per-second
# --------------------------------------------------------------------------------------
# Main game loop
while not rl.window_should_close(): # Detect window close button or ESC key
# Update
# ----------------------------------------------------------------------------------
if rl.is_key_pressed(rl.KeyboardKey.KEY_SPACE):
rl.play_sound(sound_array[current_sound]) # Play the next open sound slot
current_sound += 1 # Increment the sound slot
if (
current_sound >= MAX_SOUNDS
): # If the sound slot is out of bounds, go back to 0
current_sound = 0
# Note: a better way would be to look at the list for the first sound that is not playing and use that slot
# ----------------------------------------------------------------------------------
# Draw
# ----------------------------------------------------------------------------------
rl.begin_drawing()
rl.clear_background(rl.RAYWHITE)
rl.draw_text("Press SPACE to PLAY a WAV sound!", 200, 180, 20, rl.LIGHTGRAY)
rl.end_drawing()
# ----------------------------------------------------------------------------------
# De-Initialization
# --------------------------------------------------------------------------------------
for i in range(1, MAX_SOUNDS):
rl.unload_sound_alias(sound_array[i]) # Unload sound aliases
rl.unload_sound(sound_array[0]) # Unload source sound data
rl.close_audio_device() # Close audio device
rl.close_window() # Close window and OpenGL context
# --------------------------------------------------------------------------------------

View file

@ -1,112 +0,0 @@
"""checked with raylib-python-cffi 5.5.0.2
raylib [audio] example - Playing spatialized 3D sound
Example complexity rating: [] 2/4
Example originally created with raylib 5.5, last time updated with raylib 5.5
Example contributed by Le Juez Victor (@Bigfoot71) and reviewed by Ramon Santamaria (@raysan5)
Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
BSD-like license that allows static linking with closed source software
Copyright (c) 2025 Le Juez Victor (@Bigfoot71)
This source has been converted from C raylib examples to Python.
"""
import pyray as rl
import math
from pathlib import Path
# Get the directory where this script is located
THIS_DIR = Path(__file__).resolve().parent
# Sound positioning function
def set_sound_position(listener, sound, position, max_dist):
# Calculate direction vector and distance between listener and sound source
direction = rl.vector3_subtract(position, listener.position)
distance = rl.vector3_length(direction)
# Apply logarithmic distance attenuation and clamp between 0-1
attenuation = 1.0 / (1.0 + (distance / max_dist))
attenuation = rl.clamp(attenuation, 0.0, 1.0)
# Calculate normalized vectors for spatial positioning
normalized_direction = rl.vector3_normalize(direction)
forward = rl.vector3_normalize(
rl.vector3_subtract(listener.target, listener.position)
)
right = rl.vector3_normalize(rl.vector3_cross_product(listener.up, forward))
# Reduce volume for sounds behind the listener
dot_product = rl.vector3_dot_product(forward, normalized_direction)
if dot_product < 0.0:
attenuation *= 1.0 + dot_product * 0.5
# Set stereo panning based on sound position relative to listener
pan = 0.5 + 0.5 * rl.vector3_dot_product(normalized_direction, right)
# Apply final sound properties
rl.set_sound_volume(sound, attenuation)
rl.set_sound_pan(sound, pan)
# Initialization
# --------------------------------------------------------------------------------------
screen_width = 800
screen_height = 450
rl.init_window(
screen_width, screen_height, "raylib [audio] example - Playing spatialized 3D sound"
)
rl.init_audio_device()
sound = rl.load_sound(str(THIS_DIR / "resources/coin.wav"))
camera = rl.Camera3D(
(0, 5, 5),
(0, 0, 0),
(0, 1, 0),
60.0,
rl.CameraProjection.CAMERA_PERSPECTIVE,
)
rl.disable_cursor()
rl.set_target_fps(60)
# --------------------------------------------------------------------------------------
# Main game loop
while not rl.window_should_close():
# Update
# ----------------------------------------------------------------------------------
rl.update_camera(camera, rl.CameraMode.CAMERA_FREE)
th = rl.get_time()
sphere_pos = rl.Vector3(5.0 * math.cos(th), 0.0, 5.0 * math.sin(th))
set_sound_position(camera, sound, sphere_pos, 20.0)
if not rl.is_sound_playing(sound):
rl.play_sound(sound)
# ----------------------------------------------------------------------------------
# Draw
# ----------------------------------------------------------------------------------
rl.begin_drawing()
rl.clear_background(rl.RAYWHITE)
rl.begin_mode_3d(camera)
rl.draw_grid(10, 2)
rl.draw_sphere(sphere_pos, 0.5, rl.RED)
rl.end_mode_3d()
rl.end_drawing()
# ----------------------------------------------------------------------------------
# De-Initialization
# --------------------------------------------------------------------------------------
rl.unload_sound(sound)
rl.close_audio_device() # Close audio device
rl.close_window() # Close window and OpenGL context
# --------------------------------------------------------------------------------------

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,11 +1,11 @@
""" """
raylib [core] example - 2D Camera System raylib [core] example - 2d camera
""" """
import pyray import pyray
from pyray import ( from raylib.colors import (
RAYWHITE, RAYWHITE,
DARKGRAY, DARKGRAY,
RED, RED,
@ -15,12 +15,16 @@ from pyray import (
BLACK, BLACK,
) )
# Initialization # Initialization
MAX_BUILDINGS = 100 MAX_BUILDINGS = 100
SCREEN_WIDTH = 800 SCREEN_WIDTH = 800
SCREEN_HEIGHT = 450 SCREEN_HEIGHT = 450
pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT,'raylib [core] example - 2d camera') pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT,
'raylib [core] example - 2d camera')
player = pyray.Rectangle(400, 280, 40, 40) player = pyray.Rectangle(400, 280, 40, 40)
buildings = [] buildings = []
@ -52,23 +56,24 @@ camera.zoom = 1.0
pyray.set_target_fps(60) # Set our game to run at 60 frames-per-second pyray.set_target_fps(60) # Set our game to run at 60 frames-per-second
# Main game loop # Main game loop
while not pyray.window_should_close(): # Detect window close button or ESC key while not pyray.window_should_close(): # Detect window close button or ESC key
# Update # Update
# Player movement # Player movement
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT): if pyray.is_key_down(pyray.KEY_RIGHT):
player.x += 2 player.x += 2
elif pyray.is_key_down(pyray.KeyboardKey.KEY_LEFT): elif pyray.is_key_down(pyray.KEY_LEFT):
player.x -= 2 player.x -= 2
# Camera target follows player # Camera target follows player
camera.target = pyray.Vector2(player.x + 20, player.y + 20) camera.target = pyray.Vector2(player.x + 20, player.y + 20)
# Camera rotation controls # Camera rotation controls
if pyray.is_key_down(pyray.KeyboardKey.KEY_A): if pyray.is_key_down(pyray.KEY_A):
camera.rotation -= 1 camera.rotation -= 1
elif pyray.is_key_down(pyray.KeyboardKey.KEY_S): elif pyray.is_key_down(pyray.KEY_S):
camera.rotation += 1 camera.rotation += 1
# Limit camera rotation to 80 degrees (-40 to 40) # Limit camera rotation to 80 degrees (-40 to 40)
@ -86,7 +91,7 @@ while not pyray.window_should_close(): # Detect window close button or ESC key
camera.zoom = 0.1 camera.zoom = 0.1
# Camera reset (zoom and rotation) # Camera reset (zoom and rotation)
if pyray.is_key_pressed(pyray.KeyboardKey.KEY_R): if pyray.is_key_pressed(pyray.KEY_R):
camera.zoom = 1.0 camera.zoom = 1.0
camera.rotation = 0.0 camera.rotation = 0.0
@ -128,5 +133,6 @@ while not pyray.window_should_close(): # Detect window close button or ESC key
pyray.end_drawing() pyray.end_drawing()
# De-Initialization # De-Initialization
pyray.close_window() # Close window and OpenGL context pyray.close_window() # Close window and OpenGL context

View file

@ -1,66 +0,0 @@
"""
raylib [core] example - 2d camera mouse zoom
"""
import pyray
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 450
pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [core] example - 2d camera mouse zoom")
pyray.set_target_fps(60)
camera = pyray.Camera2D()
camera.zoom = 1.0
pyray.set_target_fps(60)
# main game loop
while not pyray.window_should_close():
# update
if pyray.is_mouse_button_down(pyray.MouseButton.MOUSE_BUTTON_RIGHT):
delta = pyray.get_mouse_delta()
delta = pyray.vector2_scale(delta, -1.0 / camera.zoom)
camera.target = pyray.vector2_add(camera.target, delta)
# zoom based on mouse wheel
wheel = pyray.get_mouse_wheel_move()
if wheel != 0:
mouseWorldPos = pyray.get_screen_to_world_2d(pyray.get_mouse_position(), camera)
camera.offset = pyray.get_mouse_position()
camera.target = mouseWorldPos
ZOOM_INCREMENT = 0.125
camera.zoom += (wheel*ZOOM_INCREMENT)
if (camera.zoom < ZOOM_INCREMENT): camera.zoom = ZOOM_INCREMENT
# draw
pyray.begin_drawing()
pyray.clear_background(pyray.BLACK)
pyray.begin_mode_2d(camera)
pyray.rl_push_matrix()
pyray.rl_translatef(0, 25*50, 0)
pyray.rl_rotatef(90, 1, 0, 0)
pyray.draw_grid(100, 50)
pyray.rl_pop_matrix()
pyray.draw_circle(100, 100, 50, pyray.YELLOW)
pyray.end_mode_2d()
pyray.draw_text("Mouse right button drag to move, mouse wheel to zoom", 10, 10, 20, pyray.WHITE)
pyray.end_drawing()
# de-Initialization
pyray.close_window()

Some files were not shown because too many files have changed in this diff Show more