Compare commits
No commits in common. "master" and "v5.0.0.2" have entirely different histories.
150 changed files with 18955 additions and 28485 deletions
142
.cirrus.yml
142
.cirrus.yml
|
@ -1,123 +1,23 @@
|
||||||
# download at https://api.cirrus-ci.com/v1/artifact/github/electronstudio/raylib-python-cffi/pi/binary.zip
|
#container:
|
||||||
# https://api.cirrus-ci.com/v1/artifact/github/electronstudio/raylib-python-cffi/mac/binary.zip
|
# image: python:3.11
|
||||||
|
|
||||||
pi_task:
|
# download at https://api.cirrus-ci.com/v1/artifact/github/electronstudio/raylib-python-cffi/main/binary.zip
|
||||||
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:
|
task:
|
||||||
macos_instance:
|
macos_instance:
|
||||||
matrix:
|
matrix:
|
||||||
|
- image: ghcr.io/cirruslabs/macos-monterey-xcode:latest
|
||||||
|
- image: ghcr.io/cirruslabs/macos-ventura-xcode:latest
|
||||||
- image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
|
- image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
|
||||||
env:
|
env:
|
||||||
MACOSX_DEPLOYMENT_TARGET: "11.0"
|
matrix:
|
||||||
matrix:
|
- PY_VER: "3.9"
|
||||||
- env:
|
- PY_VER: "3.10"
|
||||||
PY_VER: "3.9"
|
- PY_VER: "3.11"
|
||||||
RAYLIB_PLATFORM: Desktop
|
- PY_VER: "3.12"
|
||||||
- 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:
|
setup_script:
|
||||||
- brew update
|
- brew update
|
||||||
- brew install python@${PY_VER}
|
- 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:
|
build_raylib_script:
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- cd raylib-c
|
- cd raylib-c
|
||||||
|
@ -126,32 +26,14 @@ mac_task:
|
||||||
- cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
- cmake -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||||
- make -j8
|
- make -j8
|
||||||
- sudo make install
|
- 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:
|
build_script:
|
||||||
- sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
- 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/
|
||||||
|
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages --upgrade pip
|
||||||
- /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 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 setuptools
|
||||||
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages wheel
|
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages wheel
|
||||||
- /opt/homebrew/bin/python${PY_VER} setup.py bdist_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:
|
artifacts:
|
||||||
path: "dist/*"
|
path: "dist/*"
|
346
.github/workflows/build.yml
vendored
346
.github/workflows/build.yml
vendored
|
@ -4,39 +4,28 @@ 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-11
|
||||||
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', '3.12', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||||
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 }}
|
||||||
|
@ -44,7 +33,7 @@ jobs:
|
||||||
architecture: x64
|
architecture: x64
|
||||||
|
|
||||||
# Runs a set of commands using the runners shell
|
# Runs a set of commands using the runners shell
|
||||||
- name: Build raylib without SDL because SDL version has incorrect pkg-config
|
- name: Build raylib
|
||||||
run: |
|
run: |
|
||||||
cd raylib-c
|
cd raylib-c
|
||||||
mkdir build
|
mkdir build
|
||||||
|
@ -53,15 +42,6 @@ jobs:
|
||||||
make -j2
|
make -j2
|
||||||
sudo make install
|
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
|
- name: Copy extras
|
||||||
run: |
|
run: |
|
||||||
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
||||||
|
@ -69,105 +49,49 @@ jobs:
|
||||||
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
|
pip3 install setuptools
|
||||||
python setup.py bdist_wheel --plat-name macosx_10_13_x86_64
|
python setup.py bdist_wheel --plat-name macosx_10_15_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
|
- name: Upload build Artifact wheel
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v2.2.4
|
||||||
with:
|
with:
|
||||||
name: wheel-mac-${{ matrix.raylib-platform }}-${{ matrix.python-version }}
|
name: wheel
|
||||||
path: dist/*
|
path: dist/*
|
||||||
|
|
||||||
# build-mac-universal:
|
# build-mac12-arm64:
|
||||||
# runs-on: macos-14
|
# runs-on: macos-12
|
||||||
# strategy:
|
# strategy:
|
||||||
# matrix:
|
# matrix:
|
||||||
# python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
# python-version: ['3.10', '3.11.0-alpha - 3.11.0' ]
|
||||||
# raylib-platform: ['Desktop', 'SDL']
|
# # Requires universal2 build of python, which we get if we ask for 3.10.5 x86! Pypy not available in universal2
|
||||||
# env:
|
|
||||||
# MACOSX_DEPLOYMENT_TARGET: 11.0
|
|
||||||
# steps:
|
# steps:
|
||||||
# # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
# - uses: actions/checkout@v2
|
||||||
# - uses: actions/checkout@v4
|
|
||||||
# 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 -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
|
# - 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.
|
|
||||||
# python-version: ${{ matrix.python-version }}
|
# python-version: ${{ matrix.python-version }}
|
||||||
# architecture: arm64
|
# architecture: x64
|
||||||
#
|
#
|
||||||
# # Runs a set of commands using the runners shell
|
# # Only build raylib for arm64 (although we could make a fat universal2 binary by asking for x86_64 as well)
|
||||||
# - name: Build raylib without SDL because SDL version has incorrect pkg-config
|
# - name: Build raylib
|
||||||
# run: |
|
# run: |
|
||||||
# cd raylib-c
|
# cd raylib-c
|
||||||
# mkdir build
|
# mkdir build
|
||||||
# cd 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 ..
|
# cmake -DBUILD_EXAMPLES=off -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -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: 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
|
# - 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
|
|
||||||
# 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
|
# # 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
|
# # 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
|
||||||
|
@ -178,52 +102,94 @@ jobs:
|
||||||
# pip3 install cffi
|
# pip3 install cffi
|
||||||
# pip3 install wheel
|
# pip3 install wheel
|
||||||
# python setup.py bdist_wheel --plat-name macosx_12_0_arm64
|
# python setup.py bdist_wheel --plat-name macosx_12_0_arm64
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# - name: Upload build Artifact wheel
|
||||||
|
# uses: actions/upload-artifact@v2.2.4
|
||||||
|
# with:
|
||||||
|
# name: wheel
|
||||||
|
# path: dist/*
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# build-mac11-arm64:
|
||||||
|
# runs-on: macos-11
|
||||||
|
# strategy:
|
||||||
|
# matrix:
|
||||||
|
# python-version: [ '3.10.5' ]
|
||||||
|
# # Requires universal2 build of python, which we get if we ask for 3.10.5 x86! Pypy not available in universal2
|
||||||
|
# env:
|
||||||
|
# MACOSX_DEPLOYMENT_TARGET: 11.6
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v2
|
||||||
|
# with:
|
||||||
|
# submodules: recursive
|
||||||
|
#
|
||||||
|
# - name: Setup Python
|
||||||
|
# uses: actions/setup-python@v2.2.2
|
||||||
|
# with:
|
||||||
|
# python-version: ${{ matrix.python-version }}
|
||||||
|
# architecture: x64
|
||||||
|
#
|
||||||
|
# # build raylib for arm64 and x86_64 as well
|
||||||
|
# - name: Build raylib
|
||||||
|
# run: |
|
||||||
|
# cd raylib-c
|
||||||
|
# mkdir build
|
||||||
|
# cd build
|
||||||
|
# cmake -DBUILD_EXAMPLES=off -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -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 --plat-name macosx_11_0_arm64
|
||||||
|
#
|
||||||
|
# - name: Upload build Artifact wheel
|
||||||
|
# uses: actions/upload-artifact@v2.2.4
|
||||||
|
# with:
|
||||||
|
# name: wheel
|
||||||
|
# path: dist/*
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
# 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', '3.12', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||||
raylib-platform: ['Desktop', 'SDL', 'DRM']
|
|
||||||
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: ${{ 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
|
||||||
|
|
||||||
- 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: |
|
||||||
|
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
|
||||||
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 -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 ..
|
||||||
make -j2
|
make -j2
|
||||||
sudo make install
|
sudo make install
|
||||||
- name: Copy extras
|
- name: Copy extras
|
||||||
|
@ -232,37 +198,50 @@ jobs:
|
||||||
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
|
pip3 install setuptools
|
||||||
python setup.py bdist_wheel --plat-name manylinux2014_x86_64
|
python setup.py bdist_wheel --plat-name manylinux2014_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
|
- 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-rpi:
|
||||||
|
# runs-on: rpi
|
||||||
|
# steps:
|
||||||
|
# # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
# - uses: actions/checkout@v2
|
||||||
|
# with:
|
||||||
|
# submodules: recursive
|
||||||
|
#
|
||||||
|
# - name: Build raylib
|
||||||
|
# run: |
|
||||||
|
# cd raylib-c
|
||||||
|
# mkdir build
|
||||||
|
# cd build
|
||||||
|
# cmake -DBUILD_EXAMPLES=off -DINCLUDE_EVERYTHING=on -DSUPPORT_FILEFORMAT_JPG=on -DWITH_PIC=on -DCMAKE_BUILD_TYPE=Release -DOpenGL_GL_PREFERENCE=GLVND ..
|
||||||
|
# make -j2
|
||||||
|
# make install
|
||||||
|
# - name: Copy extras
|
||||||
|
# run: |
|
||||||
|
# cp physac/src/physac.h /usr/local/include/
|
||||||
|
# cp raygui/src/raygui.h /usr/local/include/
|
||||||
|
#
|
||||||
|
# - name: Build raylib-python-cffi
|
||||||
|
# run: |
|
||||||
|
# python3 setup.py bdist_wheel
|
||||||
|
#
|
||||||
|
# - name: Upload build Artifact wheel
|
||||||
|
# uses: actions/upload-artifact@v2.2.4
|
||||||
|
# with:
|
||||||
|
# name: wheel
|
||||||
|
# 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
|
||||||
|
@ -271,27 +250,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', '3.12', 'pypy-3.7', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||||
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,27 +266,23 @@ 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 -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=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
|
pip3 install setuptools
|
||||||
del raylib\dynamic\*.so* >nul 2>&1
|
del raylib\dynamic\*.so* >nul 2>&1
|
||||||
|
@ -328,49 +291,34 @@ jobs:
|
||||||
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-20.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
|
||||||
|
@ -386,55 +334,45 @@ jobs:
|
||||||
- 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
|
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-20.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
|
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
4
.gitmodules
vendored
|
@ -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
|
||||||
|
|
|
@ -38,7 +38,7 @@ project.
|
||||||
If the Pip build doesn’t work, please submit a bug. (And if you have
|
If the Pip build doesn’t 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 +83,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:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
226
README.md
226
README.md
|
@ -1,216 +1,134 @@
|
||||||
# Python Bindings for Raylib 5.5
|
# Python Bindings for Raylib 5.0
|
||||||
## Libraries: raymath, raygui, rlgl, physac and GLFW
|
|
||||||
## Backends: Desktop, SDL, DRM, Web
|
|
||||||
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
|
|
||||||
|
|
||||||

|
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, physac and GLFW**
|
||||||
|
|
||||||
|
|
||||||
[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 *
|
from pyray import *
|
||||||
init_window(800, 450, "Hello")
|
init_window(800, 450, "Hello")
|
||||||
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()
|
||||||
close_window()
|
close_window()
|
||||||
```
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
If you are on a modern Linux you will probably want to create a venv:
|
First make sure you have the latest pip installed:
|
||||||
|
|
||||||
python3 -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
|
|
||||||
Then make sure you have the latest pip installed:
|
|
||||||
|
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
Then install
|
Then install
|
||||||
|
|
||||||
python3 -m pip install setuptools
|
python3 -m pip install setuptools
|
||||||
python3 -m pip install raylib==5.5.0.2
|
python3 -m pip install raylib
|
||||||
|
|
||||||
On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from
|
On most platforms it should install a binary wheel (Windows 10 x64, MacOS 10.15 x64, Linux Ubuntu1804 x64).
|
||||||
source, in which case you will need to have Raylib development libs installed, e.g.
|
|
||||||
|
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.
|
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
|
## Raspberry Pi
|
||||||
|
|
||||||
[Using on Rasperry Pi](RPI.rst)
|
[Using on Rasperry Pi](RPI.rst)
|
||||||
|
|
||||||
# Backends
|
|
||||||
|
|
||||||
## Dynamic binding version
|
## Dynamic binding version
|
||||||
|
|
||||||
There is now a separate dynamic version of this binding:
|
There is now a separate dynamic version of this binding:
|
||||||
|
|
||||||
python3 -m pip uninstall raylib
|
|
||||||
python3 -m pip install raylib_dynamic
|
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)
|
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.
|
## Beta testing
|
||||||
|
|
||||||
## SDL backend
|
If you find a bug, it may be fixed in the [latest dev release](https://github.com/electronstudio/raylib-python-cffi/releases).
|
||||||
|
You can install an alpha or beta version by specifying the exact version number like this:
|
||||||
|
|
||||||
This is not well tested but has better support for controllers:
|
python3 -m pip install raylib==4.2.0.0.dev4
|
||||||
|
|
||||||
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?
|
## 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)
|
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.
|
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)
|
If you need help you can try asking [on 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).
|
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
|
||||||
|
|
||||||
|
|
||||||
# How to use
|
# How to use
|
||||||
|
|
||||||
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
|
There are two APIs, you can use either or both:
|
||||||
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
|
### 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).
|
Use [the C API](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
|
||||||
|
|
||||||
### If you prefer a more Pythonistic API
|
### If you prefer a slightly more Pythonistic API and don't mind it might be slightly slower
|
||||||
|
|
||||||
Use [the pyray module](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
|
Use [the Python API](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
|
||||||
|
|
||||||
# Running in a web browser
|
# 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
|
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser.
|
||||||
is recommended.
|
|
||||||
|
|
||||||
Make a folder `my_project` with a file `main.py`:
|
Make a folder `my_project` with a file `main.py`:
|
||||||
|
|
||||||
```python
|
# /// script
|
||||||
# /// script
|
# dependencies = [
|
||||||
# dependencies = [
|
# "cffi",
|
||||||
# "cffi",
|
# "inflection",
|
||||||
# "raylib"
|
# "raylib"
|
||||||
# ]
|
# ]
|
||||||
# ///
|
# ///
|
||||||
import asyncio
|
import asyncio
|
||||||
import platform
|
import platform
|
||||||
from pyray import *
|
from pyray import *
|
||||||
|
|
||||||
async def main(): # You MUST have an async main function
|
async def main(): # You must have an async main function
|
||||||
init_window(500, 500, "Hello")
|
init_window(500, 500, "Hello")
|
||||||
platform.window.window_resize() # You MAY want to add this line
|
platform.window.window_resize() # You must 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
|
await asyncio.sleep(0) # You must call this in your main loop
|
||||||
close_window()
|
close_window()
|
||||||
|
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
```
|
|
||||||
|
|
||||||
Then to create the web files and launch a web server:
|
Then to create the web files and launch a web server:
|
||||||
|
|
||||||
python3.12 -m pip install --user --upgrade pygbag
|
python3 -m pip install --user --upgrade git+https://github.com/pygame-web/pygbag
|
||||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
python3 -m pygbag --git --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||||
|
|
||||||
Point your browser to http://localhost:8000
|
Point your browser to http://localhost:8000
|
||||||
|
|
||||||
Some features may not work, so you can disable them like this:
|
|
||||||
|
|
||||||
```python
|
|
||||||
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.
|
This is all done by Pygbag rather than by me, so you should probably contact them with any issues.
|
||||||
Carefully read all their [documentation](https://pygame-web.github.io/).
|
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/)
|
It does work for most of the examples at https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/
|
||||||
|
|
||||||
# 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 +142,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 +179,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.
|
55
RPI.rst
55
RPI.rst
|
@ -1,21 +1,20 @@
|
||||||
Raspberry Pi
|
Raspberry Pi
|
||||||
====================
|
====================
|
||||||
|
|
||||||
Please use Raspberry Pi OS Bookworm. Bullseye should also work. Older OSes are not tested.
|
Please use Raspberry Pi OS Bullseye. Older OSes are not tested.
|
||||||
|
|
||||||
Option 1: Binary wheel
|
Option 1: Binary wheel
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11 mode.
|
We have published a binary wheel using Raylib in X11 mode. This *should probably* install and work on Bullseye
|
||||||
|
with
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python -m pip install --break-system-packages raylib
|
python3.9 -m pip install raylib==4.2.1.2
|
||||||
|
|
||||||
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
|
If it doesn't work, or you're not on Bullseye, or you want a newer version,
|
||||||
installed at once.
|
or if you want to use Raylib in ``PLATFORM_DRM`` mode, you will need to compile your own raylib. See below.
|
||||||
|
|
||||||
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.
|
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
|
Option 2: Compile Raylib from source X11 mode
|
||||||
|
@ -25,8 +24,6 @@ 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
|
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
|
||||||
cd raylib
|
cd raylib
|
||||||
mkdir build
|
mkdir build
|
||||||
|
@ -35,57 +32,41 @@ This should work for everyone.
|
||||||
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 ..
|
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
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
sudo cp -r ../src/external/glfw/include/GLFW /usr/local/include/
|
|
||||||
|
|
||||||
Then have pip compile and install the wheel:
|
Then have pip compile and install the wheel:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python3 -m pip install --break-system-packages setuptools
|
sudo apt update
|
||||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
sudo apt install python3-pip
|
||||||
|
pip3 install setuptools
|
||||||
|
pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib==5.0.0.1
|
||||||
|
|
||||||
Option 3: Compile Raylib from source DRM mode
|
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.
|
As far as I can tell, Raylib DRM is broken. It doesn't work on my Pi. However, if you want to compile it and
|
||||||
|
give it a go, these are the commands:
|
||||||
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
|
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
|
||||||
cd raylib
|
cd raylib
|
||||||
mkdir build
|
mkdir build
|
||||||
rm rf build/*
|
rm rf build/*
|
||||||
cd 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 ..
|
cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
|
|
||||||
Then have pip compile and install the wheel:
|
Then have pip compile and install the wheel with some extra linker flags:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python3 -m pip install --break-system-packages setuptools
|
sudo apt update
|
||||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
sudo apt install python3-pip
|
||||||
|
pip3 install setuptools
|
||||||
|
LDFLAGS="-lgbm -ldrm -lEGL" pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib==5.0.0.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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("")
|
||||||
|
@ -35,4 +34,3 @@ print("""from enum import IntEnum
|
||||||
process("raylib.json")
|
process("raylib.json")
|
||||||
process("raygui.json")
|
process("raygui.json")
|
||||||
process("glfw3.json")
|
process("glfw3.json")
|
||||||
process("physac.json")
|
|
||||||
|
|
|
@ -14,14 +14,12 @@
|
||||||
|
|
||||||
from pathlib import Path
|
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 = {}
|
known_functions = {}
|
||||||
known_structs = {}
|
known_structs = {}
|
||||||
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"),
|
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"), Path("glfw3.json")):
|
||||||
Path("glfw3.json")):
|
|
||||||
f = open(filename, "r")
|
f = open(filename, "r")
|
||||||
js = json.load(f)
|
js = json.load(f)
|
||||||
for fn in js["functions"]:
|
for fn in js["functions"]:
|
||||||
|
@ -30,13 +28,6 @@ for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), P
|
||||||
for st in js["structs"]:
|
for st in js["structs"]:
|
||||||
if st["name"] not in known_structs:
|
if st["name"] not in known_structs:
|
||||||
known_structs[st["name"]] = st
|
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):
|
||||||
|
@ -48,49 +39,35 @@ 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:
|
elif "char * *" in t:
|
||||||
return "list[str]"
|
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
|
# 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")
|
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_object = known_functions.get(name, None)
|
||||||
if json_object is None:
|
if json_object is None:
|
||||||
|
@ -101,7 +78,7 @@ for name, attr in getmembers(rl):
|
||||||
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']
|
||||||
|
@ -109,8 +86,6 @@ for name, attr in getmembers(rl):
|
||||||
if param_name in reserved_words:
|
if param_name in reserved_words:
|
||||||
param_name = param_name + "_" + str(i)
|
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,19 +95,16 @@ 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}")
|
||||||
|
|
||||||
|
@ -146,51 +118,21 @@ for struct in ffi.list_types()[0]:
|
||||||
# so we don't want it in the pyray API
|
# so we don't want it in the pyray API
|
||||||
continue
|
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
|
|
||||||
""")
|
|
||||||
|
|
|
@ -19,8 +19,7 @@ import inflection, sys, json
|
||||||
|
|
||||||
known_functions = {}
|
known_functions = {}
|
||||||
known_structs = {}
|
known_structs = {}
|
||||||
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"),
|
for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), Path("raygui.json"), Path("physac.json"), Path("glfw3.json")):
|
||||||
Path("glfw3.json")):
|
|
||||||
f = open(filename, "r")
|
f = open(filename, "r")
|
||||||
js = json.load(f)
|
js = json.load(f)
|
||||||
for fn in js["functions"]:
|
for fn in js["functions"]:
|
||||||
|
@ -31,6 +30,7 @@ for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), P
|
||||||
known_structs[st["name"]] = st
|
known_structs[st["name"]] = st
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def ctype_to_python_type(t):
|
def ctype_to_python_type(t):
|
||||||
if t == '_Bool':
|
if t == '_Bool':
|
||||||
return "bool"
|
return "bool"
|
||||||
|
@ -40,41 +40,28 @@ 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
|
import _cffi_backend
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
rl: _cffi_backend.Lib
|
rl: _cffi_backend.Lib
|
||||||
PhysicsShapeType = int
|
|
||||||
|
|
||||||
class struct: ...
|
class struct: ...
|
||||||
|
|
||||||
|
@ -94,19 +81,15 @@ for name, attr in getmembers(rl):
|
||||||
param_name = str(arg.cname).split("(", 1)[0] + "_callback_" + str(i)
|
param_name = str(arg.cname).split("(", 1)[0] + "_callback_" + str(i)
|
||||||
else:
|
else:
|
||||||
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']
|
||||||
# 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:
|
# don't use a python reserved word:
|
||||||
if param_name in reserved_words:
|
if param_name in reserved_words:
|
||||||
param_name = param_name + "_" + str(i)
|
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 +98,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 +115,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
|
|
||||||
""")
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ 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 all examples here <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
|
||||||
|
|
||||||
|
|
|
@ -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: 9916125ae8fbc6b931a6987aa12f983d
|
||||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<head>
|
<head>
|
||||||
|
@ -7,16 +5,20 @@
|
||||||
|
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Building from source — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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" />
|
||||||
|
@ -45,16 +47,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
@ -128,7 +129,7 @@ project.</p>
|
||||||
<p>If the Pip build doesn’t work, please submit a bug. (And if you have
|
<p>If the Pip build doesn’t 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">
|
<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="Link to this heading"></a></h3>
|
||||||
|
|
277
docs/README.html
277
docs/README.html
|
@ -1,22 +1,24 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<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" />
|
||||||
|
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Python Bindings for Raylib 5.0 — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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" />
|
||||||
|
@ -45,37 +47,25 @@
|
||||||
</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" role="heading"><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 5.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>
|
<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>
|
<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 don’t 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="#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>
|
||||||
|
@ -103,7 +93,7 @@
|
||||||
<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" aria-label="Home"></a></li>
|
||||||
<li class="breadcrumb-item active">Python Bindings for Raylib 5.5</li>
|
<li class="breadcrumb-item active">Python Bindings for Raylib 5.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,203 +103,130 @@
|
||||||
<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">
|
<section id="python-bindings-for-raylib-5-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 5.0<a class="headerlink" href="#python-bindings-for-raylib-5-0" title="Link to this heading"></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: raymath, raygui, rlgl, physac and GLFW</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>
|
</section>
|
||||||
</section>
|
|
||||||
<section id="quickstart">
|
<section id="quickstart">
|
||||||
<h1>Quickstart<a class="headerlink" href="#quickstart" title="Link to this heading"></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==5.5.0.2</span> <span class="pre">--break-system-packages</span></code></p>
|
<p><code class="docutils literal notranslate"><span class="pre">pip3</span> <span class="pre">install</span> <span class="pre">raylib</span></code></p>
|
||||||
<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>
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>from pyray import *
|
||||||
<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">"Hello"</span><span class="p">)</span>
|
init_window(800, 450, "Hello")
|
||||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span>
|
while not window_should_close():
|
||||||
<span class="n">begin_drawing</span><span class="p">()</span>
|
begin_drawing()
|
||||||
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span>
|
clear_background(WHITE)
|
||||||
<span class="n">draw_text</span><span class="p">(</span><span class="s2">"Hello world"</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>
|
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||||
<span class="n">end_drawing</span><span class="p">()</span>
|
end_drawing()
|
||||||
<span class="n">close_window</span><span class="p">()</span>
|
close_window()
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="installation">
|
<section id="installation">
|
||||||
<h1>Installation<a class="headerlink" href="#installation" title="Link to this heading"></a></h1>
|
<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>
|
<p>First make sure you have the latest pip installed:</p>
|
||||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<p>Then 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 setuptools
|
||||||
python3 -m pip install raylib==5.5.0.2
|
python3 -m pip install raylib
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>On most platforms it should install a binary wheel. If yours isn’t 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 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.</p>
|
using homebrew, apt, etc.</p>
|
||||||
<section id="windows">
|
|
||||||
<h2>Windows<a class="headerlink" href="#windows" title="Link to this heading"></a></h2>
|
|
||||||
<p>Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)</p>
|
|
||||||
<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">
|
<section id="raspberry-pi">
|
||||||
<h2>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Link to this heading"></a></h2>
|
<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>
|
<p><a class="reference internal" href="RPI.html"><span class="std std-doc">Using on Rasperry Pi</span></a></p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
|
||||||
<section id="backends">
|
|
||||||
<h1>Backends<a class="headerlink" href="#backends" title="Link to this heading"></a></h1>
|
|
||||||
<section id="dynamic-binding-version">
|
<section id="dynamic-binding-version">
|
||||||
<h2>Dynamic binding version<a class="headerlink" href="#dynamic-binding-version" title="Link to this heading"></a></h2>
|
<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 doesn’t, <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>It works on some systems where the static version doesn’t, <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>You can’t have multiple raylib packages installed at once.</p>
|
|
||||||
</section>
|
</section>
|
||||||
<section id="sdl-backend">
|
<section id="beta-testing">
|
||||||
<h2>SDL backend<a class="headerlink" href="#sdl-backend" title="Link to this heading"></a></h2>
|
<h2>Beta testing<a class="headerlink" href="#beta-testing" title="Link to this heading"></a></h2>
|
||||||
<p>This is not well tested but has better support for controllers:</p>
|
<p>If you find a bug, it may be fixed in the <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/releases">latest dev release</a>.
|
||||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib
|
You can install an alpha or beta version by specifying the exact version number like this:</p>
|
||||||
python3 -m pip install raylib_sdl
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib==4.2.0.0.dev4
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>You can’t 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 don’t 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>
|
|
||||||
<p>You can’t have multiple raylib packages installed at once.</p>
|
|
||||||
</section>
|
</section>
|
||||||
<section id="problems">
|
<section id="problems">
|
||||||
<h2>Problems?<a class="headerlink" href="#problems" title="Link to this heading"></a></h2>
|
<h2>Problems?<a class="headerlink" href="#problems" title="Link to this heading"></a></h2>
|
||||||
<p>If it doesn’t 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>
|
<p>If it doesn’t work, <a class="reference internal" href="BUILDING.html"><span class="std std-doc">try to build manually.</span></a>. 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>
|
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>
|
<p>If you need help you can try asking <a class="reference external" href="https://discord.gg/raylib">on Discord</a>.</p>
|
||||||
for issues that are not Python-specific.</p>
|
|
||||||
<p>If it still doesn’t work, <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues">submit an issue</a>.</p>
|
<p>If it still doesn’t work, <a class="reference external" href="https://github.com/electronstudio/raylib-python-cffi/issues">submit an issue</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section id="how-to-use">
|
<section id="how-to-use">
|
||||||
<h1>How to use<a class="headerlink" href="#how-to-use" title="Link to this heading"></a></h1>
|
<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
|
<p>There are two APIs, you can use either or both:</p>
|
||||||
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">
|
<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>
|
<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>
|
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/raylib.html">the C API</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="if-you-prefer-a-more-pythonistic-api">
|
<section id="if-you-prefer-a-slightly-more-pythonistic-api-and-don-t-mind-it-might-be-slightly-slower">
|
||||||
<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>
|
<h2>If you prefer a slightly more Pythonistic API and don’t 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="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>
|
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/pyray.html">the Python API</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section id="running-in-a-web-browser">
|
<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>
|
<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> >=0.8.7 supports running in a web browser. Usually the latest git version
|
<p><a class="reference external" href="https://pypi.org/project/pygbag/">Pygbag</a> >=0.8.7 supports running in a web browser.</p>
|
||||||
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>
|
<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>
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span># /// script
|
||||||
<span class="c1"># dependencies = [</span>
|
# dependencies = [
|
||||||
<span class="c1"># "cffi",</span>
|
# "cffi",
|
||||||
<span class="c1"># "raylib"</span>
|
# "inflection",
|
||||||
<span class="c1"># ]</span>
|
# "raylib"
|
||||||
<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>
|
import asyncio
|
||||||
<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>
|
import platform
|
||||||
|
from pyray import *
|
||||||
|
|
||||||
<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>
|
async def main(): # You must have an async main function
|
||||||
<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">"Hello"</span><span class="p">)</span>
|
init_window(500, 500, "Hello")
|
||||||
<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>
|
platform.window.window_resize() # You must add this line
|
||||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span>
|
while not window_should_close():
|
||||||
<span class="n">begin_drawing</span><span class="p">()</span>
|
begin_drawing()
|
||||||
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span>
|
clear_background(WHITE)
|
||||||
<span class="n">draw_text</span><span class="p">(</span><span class="s2">"Hello world"</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>
|
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||||
<span class="n">end_drawing</span><span class="p">()</span>
|
end_drawing()
|
||||||
<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>
|
await asyncio.sleep(0) # You must call this in your main loop
|
||||||
<span class="n">close_window</span><span class="p">()</span>
|
close_window()
|
||||||
|
|
||||||
<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>
|
asyncio.run(main())
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Then to create the web files and launch a web server:</p>
|
<p>Then to create the web files and launch a web server:</p>
|
||||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3.12 -m pip install --user --upgrade pygbag
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install --user --upgrade git+https://github.com/pygame-web/pygbag
|
||||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
python3 -m pygbag --git --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Point your browser to http://localhost:8000</p>
|
<p>Point your browser to http://localhost:8000</p>
|
||||||
<p>Some features may not work, so you can disable them like this:</p>
|
|
||||||
<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">"Emscripten"</span><span class="p">:</span> <span class="c1"># audio may not work on current version of emscripten</span>
|
|
||||||
<span class="n">init_audio_device</span><span class="p">()</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<p>This is all done by Pygbag rather than by me, so you should probably contact them with any issues.
|
<p>This is all done by Pygbag rather than by me, so you should probably contact them with any issues.
|
||||||
Carefully read all their <a class="reference external" href="https://pygame-web.github.io/">documentation</a>.</p>
|
Carefully read all their <a class="reference external" href="https://pygame-web.github.io/">documentation</a>.</p>
|
||||||
<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>
|
<p>It does work for most of the examples at https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="app-showcase">
|
<section id="app-showcase">
|
||||||
<h1>App showcase<a class="headerlink" href="#app-showcase" title="Link to this heading"></a></h1>
|
<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://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>
|
</section>
|
||||||
<section id="rlzero">
|
<section id="rlzero">
|
||||||
|
@ -324,25 +241,17 @@ Carefully read all their <a class="reference external" href="https://pygame-web.
|
||||||
<li><p>Testing on more platforms</p></li>
|
<li><p>Testing on more platforms</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section id="license">
|
<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="Link to this heading"></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>
|
</section>
|
||||||
<section id="performance">
|
<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="Link to this heading"></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 it’s 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 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.</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
|
|
||||||
you can switch your inner loop functions to these.</p></li>
|
|
||||||
<li><p>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 <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">
|
<section id="bunnymark">
|
||||||
<h2>Bunnymark<a class="headerlink" href="#bunnymark" title="Link to this heading"></a></h2>
|
<h2>Bunnymark<a class="headerlink" href="#bunnymark" title="Link to this heading"></a></h2>
|
||||||
<table class="docutils align-default">
|
<table class="docutils align-default">
|
||||||
|
@ -354,49 +263,33 @@ packages. It doesn’t work with CFFI and so doesn’t 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>
|
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section id="packaging-your-app">
|
<section id="packaging-your-app">
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<head>
|
<head>
|
||||||
|
@ -7,16 +5,20 @@
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Raspberry Pi — Raylib Python documentation</title>
|
<title>Raspberry Pi — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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" />
|
||||||
|
@ -44,16 +46,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
@ -95,24 +96,22 @@
|
||||||
|
|
||||||
<section id="raspberry-pi">
|
<section id="raspberry-pi">
|
||||||
<h1>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Link to this heading"></a></h1>
|
<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>
|
<p>Please use Raspberry Pi OS Bullseye. Older OSes are not tested.</p>
|
||||||
<section id="option-1-binary-wheel">
|
<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>
|
<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>
|
<p>We have published a binary wheel using Raylib in X11 mode. This <em>should probably</em> install and work on Bullseye
|
||||||
<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>
|
with</p>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span><span class="mf">.9</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">raylib</span><span class="o">==</span><span class="mf">4.2.1.2</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</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 can’t have both wheels
|
<p>If it doesn’t work, or you’re not on Bullseye, or you want a newer version,
|
||||||
installed at once.</p>
|
or if you want to use Raylib in <code class="docutils literal notranslate"><span class="pre">PLATFORM_DRM</span></code> mode, you will need to compile your own raylib. See below.
|
||||||
<p>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 <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>
|
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>
|
||||||
<section id="option-2-compile-raylib-from-source-x11-mode">
|
<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>
|
<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>
|
<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>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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">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">cd</span> <span class="n">raylib</span>
|
||||||
<span class="n">mkdir</span> <span class="n">build</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">rm</span> <span class="o">-</span><span class="n">rf</span> <span class="n">build</span><span class="o">/*</span>
|
||||||
|
@ -120,45 +119,35 @@ For full instructions on this, see <a class="reference external" href="https://g
|
||||||
<span class="n">cmake</span> <span class="o">-</span><span class="n">DPLATFORM</span><span class="o">=</span><span class="s2">"Desktop"</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">cmake</span> <span class="o">-</span><span class="n">DPLATFORM</span><span class="o">=</span><span class="s2">"Desktop"</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">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>
|
||||||
<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>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Then have pip compile and install the wheel:</p>
|
<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>
|
<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">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>
|
<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">pip3</span> <span class="n">install</span> <span class="n">setuptools</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><span class="o">==</span><span class="mf">5.0.0.1</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section id="option-3-compile-raylib-from-source-drm-mode">
|
<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>
|
<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>As far as I can tell, Raylib DRM is broken. It doesn’t work on my Pi. However, if you want to compile it and
|
||||||
<p>If you have ever installed Raylib or raylib-python-cffi before, remove all traces of it:</p>
|
give it a go, these are the commands:</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>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></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">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">cd</span> <span class="n">raylib</span>
|
||||||
<span class="n">mkdir</span> <span class="n">build</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">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">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">"DRM"</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">cmake</span> <span class="o">-</span><span class="n">DPLATFORM</span><span class="o">=</span><span class="s2">"DRM"</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">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 have pip compile and install the wheel:</p>
|
<p>Then have pip compile and install the wheel with some extra linker flags:</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>
|
<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">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>
|
<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">pip3</span> <span class="n">install</span> <span class="n">setuptools</span>
|
||||||
|
<span class="n">LDFLAGS</span><span class="o">=</span><span class="s2">"-lgbm -ldrm -lEGL"</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><span class="o">==</span><span class="mf">5.0.0.1</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonition attention">
|
<div class="admonition attention">
|
||||||
|
|
|
@ -38,7 +38,7 @@ project.
|
||||||
If the Pip build doesn’t work, please submit a bug. (And if you have
|
If the Pip build doesn’t 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
|
||||||
|
|
|
@ -1,216 +1,134 @@
|
||||||
# Python Bindings for Raylib 5.5
|
# Python Bindings for Raylib 5.0
|
||||||
## Libraries: raymath, raygui, rlgl, physac and GLFW
|
|
||||||
## Backends: Desktop, SDL, DRM, Web
|
|
||||||
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
|
|
||||||
|
|
||||||

|
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, physac and GLFW**
|
||||||
|
|
||||||
|
|
||||||
[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 *
|
from pyray import *
|
||||||
init_window(800, 450, "Hello")
|
init_window(800, 450, "Hello")
|
||||||
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()
|
||||||
close_window()
|
close_window()
|
||||||
```
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
If you are on a modern Linux you will probably want to create a venv:
|
First make sure you have the latest pip installed:
|
||||||
|
|
||||||
python3 -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
|
|
||||||
Then make sure you have the latest pip installed:
|
|
||||||
|
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
Then install
|
Then install
|
||||||
|
|
||||||
python3 -m pip install setuptools
|
python3 -m pip install setuptools
|
||||||
python3 -m pip install raylib==5.5.0.2
|
python3 -m pip install raylib
|
||||||
|
|
||||||
On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from
|
On most platforms it should install a binary wheel (Windows 10 x64, MacOS 10.15 x64, Linux Ubuntu1804 x64).
|
||||||
source, in which case you will need to have Raylib development libs installed, e.g.
|
|
||||||
|
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.
|
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
|
## Raspberry Pi
|
||||||
|
|
||||||
[Using on Rasperry Pi](RPI.rst)
|
[Using on Rasperry Pi](RPI.rst)
|
||||||
|
|
||||||
# Backends
|
|
||||||
|
|
||||||
## Dynamic binding version
|
## Dynamic binding version
|
||||||
|
|
||||||
There is now a separate dynamic version of this binding:
|
There is now a separate dynamic version of this binding:
|
||||||
|
|
||||||
python3 -m pip uninstall raylib
|
|
||||||
python3 -m pip install raylib_dynamic
|
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)
|
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.
|
## Beta testing
|
||||||
|
|
||||||
## SDL backend
|
If you find a bug, it may be fixed in the [latest dev release](https://github.com/electronstudio/raylib-python-cffi/releases).
|
||||||
|
You can install an alpha or beta version by specifying the exact version number like this:
|
||||||
|
|
||||||
This is not well tested but has better support for controllers:
|
python3 -m pip install raylib==4.2.0.0.dev4
|
||||||
|
|
||||||
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?
|
## 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)
|
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.
|
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)
|
If you need help you can try asking [on 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).
|
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
|
||||||
|
|
||||||
|
|
||||||
# How to use
|
# How to use
|
||||||
|
|
||||||
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
|
There are two APIs, you can use either or both:
|
||||||
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
|
### 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).
|
Use [the C API](https://electronstudio.github.io/raylib-python-cffi/raylib.html).
|
||||||
|
|
||||||
### If you prefer a more Pythonistic API
|
### If you prefer a slightly more Pythonistic API and don't mind it might be slightly slower
|
||||||
|
|
||||||
Use [the pyray module](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
|
Use [the Python API](https://electronstudio.github.io/raylib-python-cffi/pyray.html).
|
||||||
|
|
||||||
# Running in a web browser
|
# 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
|
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser.
|
||||||
is recommended.
|
|
||||||
|
|
||||||
Make a folder `my_project` with a file `main.py`:
|
Make a folder `my_project` with a file `main.py`:
|
||||||
|
|
||||||
```python
|
# /// script
|
||||||
# /// script
|
# dependencies = [
|
||||||
# dependencies = [
|
# "cffi",
|
||||||
# "cffi",
|
# "inflection",
|
||||||
# "raylib"
|
# "raylib"
|
||||||
# ]
|
# ]
|
||||||
# ///
|
# ///
|
||||||
import asyncio
|
import asyncio
|
||||||
import platform
|
import platform
|
||||||
from pyray import *
|
from pyray import *
|
||||||
|
|
||||||
async def main(): # You MUST have an async main function
|
async def main(): # You must have an async main function
|
||||||
init_window(500, 500, "Hello")
|
init_window(500, 500, "Hello")
|
||||||
platform.window.window_resize() # You MAY want to add this line
|
platform.window.window_resize() # You must 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
|
await asyncio.sleep(0) # You must call this in your main loop
|
||||||
close_window()
|
close_window()
|
||||||
|
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
```
|
|
||||||
|
|
||||||
Then to create the web files and launch a web server:
|
Then to create the web files and launch a web server:
|
||||||
|
|
||||||
python3.12 -m pip install --user --upgrade pygbag
|
python3 -m pip install --user --upgrade git+https://github.com/pygame-web/pygbag
|
||||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
python3 -m pygbag --git --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||||
|
|
||||||
Point your browser to http://localhost:8000
|
Point your browser to http://localhost:8000
|
||||||
|
|
||||||
Some features may not work, so you can disable them like this:
|
|
||||||
|
|
||||||
```python
|
|
||||||
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.
|
This is all done by Pygbag rather than by me, so you should probably contact them with any issues.
|
||||||
Carefully read all their [documentation](https://pygame-web.github.io/).
|
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/)
|
It does work for most of the examples at https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/
|
||||||
|
|
||||||
# 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 +142,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 +179,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.
|
|
@ -1,21 +1,20 @@
|
||||||
Raspberry Pi
|
Raspberry Pi
|
||||||
====================
|
====================
|
||||||
|
|
||||||
Please use Raspberry Pi OS Bookworm. Bullseye should also work. Older OSes are not tested.
|
Please use Raspberry Pi OS Bullseye. Older OSes are not tested.
|
||||||
|
|
||||||
Option 1: Binary wheel
|
Option 1: Binary wheel
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11 mode.
|
We have published a binary wheel using Raylib in X11 mode. This *should probably* install and work on Bullseye
|
||||||
|
with
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python -m pip install --break-system-packages raylib
|
python3.9 -m pip install raylib==4.2.1.2
|
||||||
|
|
||||||
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
|
If it doesn't work, or you're not on Bullseye, or you want a newer version,
|
||||||
installed at once.
|
or if you want to use Raylib in ``PLATFORM_DRM`` mode, you will need to compile your own raylib. See below.
|
||||||
|
|
||||||
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.
|
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
|
Option 2: Compile Raylib from source X11 mode
|
||||||
|
@ -25,8 +24,6 @@ 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
|
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
|
||||||
cd raylib
|
cd raylib
|
||||||
mkdir build
|
mkdir build
|
||||||
|
@ -35,57 +32,41 @@ This should work for everyone.
|
||||||
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 ..
|
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
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
sudo cp -r ../src/external/glfw/include/GLFW /usr/local/include/
|
|
||||||
|
|
||||||
Then have pip compile and install the wheel:
|
Then have pip compile and install the wheel:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python3 -m pip install --break-system-packages setuptools
|
sudo apt update
|
||||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
sudo apt install python3-pip
|
||||||
|
pip3 install setuptools
|
||||||
|
pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib==5.0.0.1
|
||||||
|
|
||||||
Option 3: Compile Raylib from source DRM mode
|
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.
|
As far as I can tell, Raylib DRM is broken. It doesn't work on my Pi. However, if you want to compile it and
|
||||||
|
give it a go, these are the commands:
|
||||||
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
|
git clone https://github.com/raysan5/raylib.git --branch 5.0 --single-branch
|
||||||
cd raylib
|
cd raylib
|
||||||
mkdir build
|
mkdir build
|
||||||
rm rf build/*
|
rm rf build/*
|
||||||
cd 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 ..
|
cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
|
|
||||||
Then have pip compile and install the wheel:
|
Then have pip compile and install the wheel with some extra linker flags:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
python3 -m pip install --break-system-packages setuptools
|
sudo apt update
|
||||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
sudo apt install python3-pip
|
||||||
|
pip3 install setuptools
|
||||||
|
LDFLAGS="-lgbm -ldrm -lEGL" pip3 install --no-cache-dir --no-binary raylib --upgrade --force-reinstall raylib==5.0.0.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ 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 all examples here <https://github.com/electronstudio/raylib-python-cffi/tree/master/examples>`_
|
||||||
|
|
||||||
|
|
23
docs/_static/basic.css
vendored
23
docs/_static/basic.css
vendored
|
@ -1,5 +1,12 @@
|
||||||
/*
|
/*
|
||||||
|
* basic.css
|
||||||
|
* ~~~~~~~~~
|
||||||
|
*
|
||||||
* Sphinx stylesheet -- basic theme.
|
* Sphinx stylesheet -- basic theme.
|
||||||
|
*
|
||||||
|
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
||||||
|
* :license: BSD, see LICENSE for details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* -- main layout ----------------------------------------------------------- */
|
/* -- main layout ----------------------------------------------------------- */
|
||||||
|
@ -108,11 +115,15 @@ 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 {
|
||||||
|
@ -741,6 +752,14 @@ abbr, acronym {
|
||||||
cursor: help;
|
cursor: help;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.translated {
|
||||||
|
background-color: rgba(207, 255, 207, 0.2)
|
||||||
|
}
|
||||||
|
|
||||||
|
.untranslated {
|
||||||
|
background-color: rgba(255, 207, 207, 0.2)
|
||||||
|
}
|
||||||
|
|
||||||
/* -- code displays --------------------------------------------------------- */
|
/* -- code displays --------------------------------------------------------- */
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
|
|
2
docs/_static/css/badge_only.css
vendored
2
docs/_static/css/badge_only.css
vendored
|
@ -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}
|
.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}}
|
2
docs/_static/css/theme.css
vendored
2
docs/_static/css/theme.css
vendored
File diff suppressed because one or more lines are too long
7
docs/_static/doctools.js
vendored
7
docs/_static/doctools.js
vendored
|
@ -1,5 +1,12 @@
|
||||||
/*
|
/*
|
||||||
|
* doctools.js
|
||||||
|
* ~~~~~~~~~~~
|
||||||
|
*
|
||||||
* Base JavaScript utilities for all Sphinx HTML documentation.
|
* Base JavaScript utilities for all Sphinx HTML documentation.
|
||||||
|
*
|
||||||
|
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
||||||
|
* :license: BSD, see LICENSE for details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
BIN
docs/_static/fonts/Lato/lato-bold.eot
vendored
BIN
docs/_static/fonts/Lato/lato-bold.eot
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bold.ttf
vendored
BIN
docs/_static/fonts/Lato/lato-bold.ttf
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bold.woff
vendored
BIN
docs/_static/fonts/Lato/lato-bold.woff
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bold.woff2
vendored
BIN
docs/_static/fonts/Lato/lato-bold.woff2
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bolditalic.eot
vendored
BIN
docs/_static/fonts/Lato/lato-bolditalic.eot
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bolditalic.ttf
vendored
BIN
docs/_static/fonts/Lato/lato-bolditalic.ttf
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bolditalic.woff
vendored
BIN
docs/_static/fonts/Lato/lato-bolditalic.woff
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-bolditalic.woff2
vendored
BIN
docs/_static/fonts/Lato/lato-bolditalic.woff2
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-italic.eot
vendored
BIN
docs/_static/fonts/Lato/lato-italic.eot
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-italic.ttf
vendored
BIN
docs/_static/fonts/Lato/lato-italic.ttf
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-italic.woff
vendored
BIN
docs/_static/fonts/Lato/lato-italic.woff
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-italic.woff2
vendored
BIN
docs/_static/fonts/Lato/lato-italic.woff2
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-regular.eot
vendored
BIN
docs/_static/fonts/Lato/lato-regular.eot
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-regular.ttf
vendored
BIN
docs/_static/fonts/Lato/lato-regular.ttf
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-regular.woff
vendored
BIN
docs/_static/fonts/Lato/lato-regular.woff
vendored
Binary file not shown.
BIN
docs/_static/fonts/Lato/lato-regular.woff2
vendored
BIN
docs/_static/fonts/Lato/lato-regular.woff2
vendored
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.
7
docs/_static/graphviz.css
vendored
7
docs/_static/graphviz.css
vendored
|
@ -1,5 +1,12 @@
|
||||||
/*
|
/*
|
||||||
|
* graphviz.css
|
||||||
|
* ~~~~~~~~~~~~
|
||||||
|
*
|
||||||
* Sphinx stylesheet -- graphviz extension.
|
* Sphinx stylesheet -- graphviz extension.
|
||||||
|
*
|
||||||
|
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
||||||
|
* :license: BSD, see LICENSE for details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
img.graphviz {
|
img.graphviz {
|
||||||
|
|
4
docs/_static/js/html5shiv-printshiv.min.js
vendored
Normal file
4
docs/_static/js/html5shiv-printshiv.min.js
vendored
Normal 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
4
docs/_static/js/html5shiv.min.js
vendored
Normal 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);
|
228
docs/_static/js/versions.js
vendored
228
docs/_static/js/versions.js
vendored
|
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
9
docs/_static/language_data.js
vendored
9
docs/_static/language_data.js
vendored
|
@ -1,12 +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-2023 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 is copied as a separate JS file, is available */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Porter Stemmer
|
* Porter Stemmer
|
||||||
|
|
66
docs/_static/pygments.css
vendored
66
docs/_static/pygments.css
vendored
|
@ -6,26 +6,26 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
|
||||||
.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 .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
|
||||||
.highlight .gr { color: #F00 } /* Generic.Error */
|
.highlight .gr { color: #FF0000 } /* 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 +33,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 */
|
211
docs/_static/searchtools.js
vendored
211
docs/_static/searchtools.js
vendored
|
@ -1,5 +1,12 @@
|
||||||
/*
|
/*
|
||||||
|
* searchtools.js
|
||||||
|
* ~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
* Sphinx JavaScript utilities for the full-text search.
|
* Sphinx JavaScript utilities for the full-text search.
|
||||||
|
*
|
||||||
|
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
|
||||||
|
* :license: BSD, see LICENSE for details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
@ -13,7 +20,7 @@ if (typeof Scorer === "undefined") {
|
||||||
// and returns the new score.
|
// and returns the new score.
|
||||||
/*
|
/*
|
||||||
score: result => {
|
score: result => {
|
||||||
const [docname, title, anchor, descr, score, filename, kind] = result
|
const [docname, title, anchor, descr, score, filename] = result
|
||||||
return score
|
return score
|
||||||
},
|
},
|
||||||
*/
|
*/
|
||||||
|
@ -40,14 +47,6 @@ if (typeof Scorer === "undefined") {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global search result kind enum, used by themes to style search results.
|
|
||||||
class SearchResultKind {
|
|
||||||
static get index() { return "index"; }
|
|
||||||
static get object() { return "object"; }
|
|
||||||
static get text() { return "text"; }
|
|
||||||
static get title() { return "title"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
const _removeChildren = (element) => {
|
const _removeChildren = (element) => {
|
||||||
while (element && element.lastChild) element.removeChild(element.lastChild);
|
while (element && element.lastChild) element.removeChild(element.lastChild);
|
||||||
};
|
};
|
||||||
|
@ -65,13 +64,9 @@ const _displayItem = (item, searchTerms, highlightTerms) => {
|
||||||
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
|
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
|
||||||
const contentRoot = document.documentElement.dataset.content_root;
|
const contentRoot = document.documentElement.dataset.content_root;
|
||||||
|
|
||||||
const [docName, title, anchor, descr, score, _filename, kind] = item;
|
const [docName, title, anchor, descr, score, _filename] = item;
|
||||||
|
|
||||||
let listItem = document.createElement("li");
|
let listItem = document.createElement("li");
|
||||||
// Add a class representing the item's type:
|
|
||||||
// can be used by a theme's CSS selector for styling
|
|
||||||
// See SearchResultKind for the class names.
|
|
||||||
listItem.classList.add(`kind-${kind}`);
|
|
||||||
let requestUrl;
|
let requestUrl;
|
||||||
let linkUrl;
|
let linkUrl;
|
||||||
if (docBuilder === "dirhtml") {
|
if (docBuilder === "dirhtml") {
|
||||||
|
@ -104,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => {
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
if (data)
|
if (data)
|
||||||
listItem.appendChild(
|
listItem.appendChild(
|
||||||
Search.makeSearchSummary(data, searchTerms, anchor)
|
Search.makeSearchSummary(data, searchTerms)
|
||||||
);
|
);
|
||||||
// highlight search terms in the summary
|
// highlight search terms in the summary
|
||||||
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
|
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
|
||||||
|
@ -120,11 +115,9 @@ const _finishSearch = (resultCount) => {
|
||||||
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
|
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
|
||||||
);
|
);
|
||||||
else
|
else
|
||||||
Search.status.innerText = Documentation.ngettext(
|
Search.status.innerText = _(
|
||||||
"Search finished, found one page matching the search query.",
|
`Search finished, found ${resultCount} page(s) matching the search query.`
|
||||||
"Search finished, found ${resultCount} pages matching the search query.",
|
);
|
||||||
resultCount,
|
|
||||||
).replace('${resultCount}', resultCount);
|
|
||||||
};
|
};
|
||||||
const _displayNextItem = (
|
const _displayNextItem = (
|
||||||
results,
|
results,
|
||||||
|
@ -144,22 +137,6 @@ const _displayNextItem = (
|
||||||
// search finished, update title and status message
|
// search finished, update title and status message
|
||||||
else _finishSearch(resultCount);
|
else _finishSearch(resultCount);
|
||||||
};
|
};
|
||||||
// Helper function used by query() to order search results.
|
|
||||||
// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
|
|
||||||
// Order the results by score (in opposite order of appearance, since the
|
|
||||||
// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
|
|
||||||
const _orderResultsByScoreThenName = (a, b) => {
|
|
||||||
const leftScore = a[4];
|
|
||||||
const rightScore = b[4];
|
|
||||||
if (leftScore === rightScore) {
|
|
||||||
// same score: sort alphabetically
|
|
||||||
const leftTitle = a[1].toLowerCase();
|
|
||||||
const rightTitle = b[1].toLowerCase();
|
|
||||||
if (leftTitle === rightTitle) return 0;
|
|
||||||
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
|
|
||||||
}
|
|
||||||
return leftScore > rightScore ? 1 : -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
|
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
|
||||||
|
@ -183,26 +160,13 @@ const Search = {
|
||||||
_queued_query: null,
|
_queued_query: null,
|
||||||
_pulse_status: -1,
|
_pulse_status: -1,
|
||||||
|
|
||||||
htmlToText: (htmlString, anchor) => {
|
htmlToText: (htmlString) => {
|
||||||
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
|
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
|
||||||
for (const removalQuery of [".headerlink", "script", "style"]) {
|
htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
|
||||||
htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
|
|
||||||
}
|
|
||||||
if (anchor) {
|
|
||||||
const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
|
|
||||||
if (anchorContent) return anchorContent.textContent;
|
|
||||||
|
|
||||||
console.warn(
|
|
||||||
`Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if anchor not specified or not found, fall back to main content
|
|
||||||
const docContent = htmlElement.querySelector('[role="main"]');
|
const docContent = htmlElement.querySelector('[role="main"]');
|
||||||
if (docContent) return docContent.textContent;
|
if (docContent !== undefined) return docContent.textContent;
|
||||||
|
|
||||||
console.warn(
|
console.warn(
|
||||||
"Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
|
"Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
|
||||||
);
|
);
|
||||||
return "";
|
return "";
|
||||||
},
|
},
|
||||||
|
@ -255,7 +219,6 @@ const Search = {
|
||||||
searchSummary.classList.add("search-summary");
|
searchSummary.classList.add("search-summary");
|
||||||
searchSummary.innerText = "";
|
searchSummary.innerText = "";
|
||||||
const searchList = document.createElement("ul");
|
const searchList = document.createElement("ul");
|
||||||
searchList.setAttribute("role", "list");
|
|
||||||
searchList.classList.add("search");
|
searchList.classList.add("search");
|
||||||
|
|
||||||
const out = document.getElementById("search-results");
|
const out = document.getElementById("search-results");
|
||||||
|
@ -276,7 +239,16 @@ const Search = {
|
||||||
else Search.deferQuery(query);
|
else Search.deferQuery(query);
|
||||||
},
|
},
|
||||||
|
|
||||||
_parseQuery: (query) => {
|
/**
|
||||||
|
* execute search (requires search index to be loaded)
|
||||||
|
*/
|
||||||
|
query: (query) => {
|
||||||
|
const filenames = Search._index.filenames;
|
||||||
|
const docNames = Search._index.docnames;
|
||||||
|
const titles = Search._index.titles;
|
||||||
|
const allTitles = Search._index.alltitles;
|
||||||
|
const indexEntries = Search._index.indexentries;
|
||||||
|
|
||||||
// stem the search terms and add them to the correct list
|
// stem the search terms and add them to the correct list
|
||||||
const stemmer = new Stemmer();
|
const stemmer = new Stemmer();
|
||||||
const searchTerms = new Set();
|
const searchTerms = new Set();
|
||||||
|
@ -312,40 +284,22 @@ const Search = {
|
||||||
// console.info("required: ", [...searchTerms]);
|
// console.info("required: ", [...searchTerms]);
|
||||||
// console.info("excluded: ", [...excludedTerms]);
|
// console.info("excluded: ", [...excludedTerms]);
|
||||||
|
|
||||||
return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
|
// array of [docname, title, anchor, descr, score, filename]
|
||||||
},
|
let results = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* execute search (requires search index to be loaded)
|
|
||||||
*/
|
|
||||||
_performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
|
|
||||||
const filenames = Search._index.filenames;
|
|
||||||
const docNames = Search._index.docnames;
|
|
||||||
const titles = Search._index.titles;
|
|
||||||
const allTitles = Search._index.alltitles;
|
|
||||||
const indexEntries = Search._index.indexentries;
|
|
||||||
|
|
||||||
// Collect multiple result groups to be sorted separately and then ordered.
|
|
||||||
// Each is an array of [docname, title, anchor, descr, score, filename, kind].
|
|
||||||
const normalResults = [];
|
|
||||||
const nonMainIndexResults = [];
|
|
||||||
|
|
||||||
_removeChildren(document.getElementById("search-progress"));
|
_removeChildren(document.getElementById("search-progress"));
|
||||||
|
|
||||||
const queryLower = query.toLowerCase().trim();
|
const queryLower = query.toLowerCase();
|
||||||
for (const [title, foundTitles] of Object.entries(allTitles)) {
|
for (const [title, foundTitles] of Object.entries(allTitles)) {
|
||||||
if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
|
if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
|
||||||
for (const [file, id] of foundTitles) {
|
for (const [file, id] of foundTitles) {
|
||||||
const score = Math.round(Scorer.title * queryLower.length / title.length);
|
let score = Math.round(100 * queryLower.length / title.length)
|
||||||
const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
|
results.push([
|
||||||
normalResults.push([
|
|
||||||
docNames[file],
|
docNames[file],
|
||||||
titles[file] !== title ? `${titles[file]} > ${title}` : title,
|
titles[file] !== title ? `${titles[file]} > ${title}` : title,
|
||||||
id !== null ? "#" + id : "",
|
id !== null ? "#" + id : "",
|
||||||
null,
|
null,
|
||||||
score + boost,
|
score,
|
||||||
filenames[file],
|
filenames[file],
|
||||||
SearchResultKind.title,
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -354,48 +308,46 @@ const Search = {
|
||||||
// search for explicit entries in index directives
|
// search for explicit entries in index directives
|
||||||
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
|
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
|
||||||
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
|
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
|
||||||
for (const [file, id, isMain] of foundEntries) {
|
for (const [file, id] of foundEntries) {
|
||||||
const score = Math.round(100 * queryLower.length / entry.length);
|
let score = Math.round(100 * queryLower.length / entry.length)
|
||||||
const result = [
|
results.push([
|
||||||
docNames[file],
|
docNames[file],
|
||||||
titles[file],
|
titles[file],
|
||||||
id ? "#" + id : "",
|
id ? "#" + id : "",
|
||||||
null,
|
null,
|
||||||
score,
|
score,
|
||||||
filenames[file],
|
filenames[file],
|
||||||
SearchResultKind.index,
|
]);
|
||||||
];
|
|
||||||
if (isMain) {
|
|
||||||
normalResults.push(result);
|
|
||||||
} else {
|
|
||||||
nonMainIndexResults.push(result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookup as object
|
// lookup as object
|
||||||
objectTerms.forEach((term) =>
|
objectTerms.forEach((term) =>
|
||||||
normalResults.push(...Search.performObjectSearch(term, objectTerms))
|
results.push(...Search.performObjectSearch(term, objectTerms))
|
||||||
);
|
);
|
||||||
|
|
||||||
// lookup as search terms in fulltext
|
// lookup as search terms in fulltext
|
||||||
normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
|
results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
|
||||||
|
|
||||||
// let the scorer override scores with a custom scoring function
|
// let the scorer override scores with a custom scoring function
|
||||||
if (Scorer.score) {
|
if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
|
||||||
normalResults.forEach((item) => (item[4] = Scorer.score(item)));
|
|
||||||
nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort each group of results by score and then alphabetically by name.
|
// now sort the results by score (in opposite order of appearance, since the
|
||||||
normalResults.sort(_orderResultsByScoreThenName);
|
// display function below uses pop() to retrieve items) and then
|
||||||
nonMainIndexResults.sort(_orderResultsByScoreThenName);
|
// alphabetically
|
||||||
|
results.sort((a, b) => {
|
||||||
// Combine the result groups in (reverse) order.
|
const leftScore = a[4];
|
||||||
// Non-main index entries are typically arbitrary cross-references,
|
const rightScore = b[4];
|
||||||
// so display them after other results.
|
if (leftScore === rightScore) {
|
||||||
let results = [...nonMainIndexResults, ...normalResults];
|
// same score: sort alphabetically
|
||||||
|
const leftTitle = a[1].toLowerCase();
|
||||||
|
const rightTitle = b[1].toLowerCase();
|
||||||
|
if (leftTitle === rightTitle) return 0;
|
||||||
|
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
|
||||||
|
}
|
||||||
|
return leftScore > rightScore ? 1 : -1;
|
||||||
|
});
|
||||||
|
|
||||||
// remove duplicate search results
|
// remove duplicate search results
|
||||||
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
|
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
|
||||||
|
@ -409,12 +361,7 @@ const Search = {
|
||||||
return acc;
|
return acc;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return results.reverse();
|
results = results.reverse();
|
||||||
},
|
|
||||||
|
|
||||||
query: (query) => {
|
|
||||||
const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
|
|
||||||
const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
|
|
||||||
|
|
||||||
// for debugging
|
// for debugging
|
||||||
//Search.lastresults = results.slice(); // a copy
|
//Search.lastresults = results.slice(); // a copy
|
||||||
|
@ -485,7 +432,6 @@ const Search = {
|
||||||
descr,
|
descr,
|
||||||
score,
|
score,
|
||||||
filenames[match[0]],
|
filenames[match[0]],
|
||||||
SearchResultKind.object,
|
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
Object.keys(objects).forEach((prefix) =>
|
Object.keys(objects).forEach((prefix) =>
|
||||||
|
@ -513,27 +459,21 @@ const Search = {
|
||||||
// perform the search on the required terms
|
// perform the search on the required terms
|
||||||
searchTerms.forEach((word) => {
|
searchTerms.forEach((word) => {
|
||||||
const files = [];
|
const files = [];
|
||||||
// find documents, if any, containing the query word in their text/title term indices
|
|
||||||
// use Object.hasOwnProperty to avoid mismatching against prototype properties
|
|
||||||
const arr = [
|
const arr = [
|
||||||
{ files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term },
|
{ files: terms[word], score: Scorer.term },
|
||||||
{ files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title },
|
{ files: titleTerms[word], score: Scorer.title },
|
||||||
];
|
];
|
||||||
// add support for partial matches
|
// add support for partial matches
|
||||||
if (word.length > 2) {
|
if (word.length > 2) {
|
||||||
const escapedWord = _escapeRegExp(word);
|
const escapedWord = _escapeRegExp(word);
|
||||||
if (!terms.hasOwnProperty(word)) {
|
Object.keys(terms).forEach((term) => {
|
||||||
Object.keys(terms).forEach((term) => {
|
if (term.match(escapedWord) && !terms[word])
|
||||||
if (term.match(escapedWord))
|
arr.push({ files: terms[term], score: Scorer.partialTerm });
|
||||||
arr.push({ files: terms[term], score: Scorer.partialTerm });
|
});
|
||||||
});
|
Object.keys(titleTerms).forEach((term) => {
|
||||||
}
|
if (term.match(escapedWord) && !titleTerms[word])
|
||||||
if (!titleTerms.hasOwnProperty(word)) {
|
arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
|
||||||
Object.keys(titleTerms).forEach((term) => {
|
});
|
||||||
if (term.match(escapedWord))
|
|
||||||
arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// no match but word was a required one
|
// no match but word was a required one
|
||||||
|
@ -549,16 +489,16 @@ const Search = {
|
||||||
|
|
||||||
// set score for the word in each file
|
// set score for the word in each file
|
||||||
recordFiles.forEach((file) => {
|
recordFiles.forEach((file) => {
|
||||||
if (!scoreMap.has(file)) scoreMap.set(file, new Map());
|
if (!scoreMap.has(file)) scoreMap.set(file, {});
|
||||||
const fileScores = scoreMap.get(file);
|
scoreMap.get(file)[word] = record.score;
|
||||||
fileScores.set(word, record.score);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// create the mapping
|
// create the mapping
|
||||||
files.forEach((file) => {
|
files.forEach((file) => {
|
||||||
if (!fileMap.has(file)) fileMap.set(file, [word]);
|
if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
|
||||||
else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
|
fileMap.get(file).push(word);
|
||||||
|
else fileMap.set(file, [word]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -590,7 +530,7 @@ const Search = {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// select one (max) score for the file.
|
// select one (max) score for the file.
|
||||||
const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
|
const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
|
||||||
// add result to the result list
|
// add result to the result list
|
||||||
results.push([
|
results.push([
|
||||||
docNames[file],
|
docNames[file],
|
||||||
|
@ -599,7 +539,6 @@ const Search = {
|
||||||
null,
|
null,
|
||||||
score,
|
score,
|
||||||
filenames[file],
|
filenames[file],
|
||||||
SearchResultKind.text,
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
|
@ -610,8 +549,8 @@ const Search = {
|
||||||
* search summary for a given text. keywords is a list
|
* search summary for a given text. keywords is a list
|
||||||
* of stemmed words.
|
* of stemmed words.
|
||||||
*/
|
*/
|
||||||
makeSearchSummary: (htmlText, keywords, anchor) => {
|
makeSearchSummary: (htmlText, keywords) => {
|
||||||
const text = Search.htmlToText(htmlText, anchor);
|
const text = Search.htmlToText(htmlText);
|
||||||
if (text === "") return null;
|
if (text === "") return null;
|
||||||
|
|
||||||
const textLower = text.toLowerCase();
|
const textLower = text.toLowerCase();
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<head>
|
<head>
|
||||||
|
@ -7,16 +5,20 @@
|
||||||
|
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Dynamic Bindings — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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" />
|
||||||
|
@ -45,16 +47,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
@ -104,11 +105,11 @@ 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.</p>
|
But the dynamic bindings have the advantage that you don’t 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 can’t have both modules installed at once.) The only difference is you can’t do:</p>
|
<p>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:</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>
|
||||||
|
|
2637
docs/genindex.html
2637
docs/genindex.html
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<head>
|
<head>
|
||||||
|
@ -7,20 +5,24 @@
|
||||||
|
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Raylib Python — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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 5.0" href="README.html" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="wy-body-for-nav">
|
<body class="wy-body-for-nav">
|
||||||
|
@ -44,16 +46,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
@ -93,16 +94,15 @@
|
||||||
<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" role="heading"><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 5.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#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>
|
||||||
|
@ -122,7 +122,7 @@
|
||||||
</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 5.0" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
BIN
docs/objects.inv
BIN
docs/objects.inv
Binary file not shown.
|
@ -1,21 +1,23 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Python Module Index — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></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" />
|
||||||
|
@ -49,16 +51,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
|
9065
docs/pyray.html
9065
docs/pyray.html
File diff suppressed because one or more lines are too long
8797
docs/raylib.html
8797
docs/raylib.html
File diff suppressed because one or more lines are too long
|
@ -1,22 +1,24 @@
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="writer-html5" lang="en" data-content_root="./">
|
<html class="writer-html5" lang="en" data-content_root="./">
|
||||||
<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 — Raylib Python documentation</title>
|
<title>Search — Raylib Python documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=eafc0fe6" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<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 src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<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=888ff710"></script>
|
||||||
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></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>
|
||||||
|
@ -45,16 +47,15 @@
|
||||||
</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" role="heading"><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 5.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#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>
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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
|
|
|
@ -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
|
@ -1,9 +1,9 @@
|
||||||
import raylib
|
import raylib
|
||||||
|
|
||||||
RAYLIB_VERSION_MAJOR: int = 5
|
RAYLIB_VERSION_MAJOR: int = 5
|
||||||
RAYLIB_VERSION_MINOR: int = 5
|
RAYLIB_VERSION_MINOR: int = 0
|
||||||
RAYLIB_VERSION_PATCH: int = 0
|
RAYLIB_VERSION_PATCH: int = 0
|
||||||
RAYLIB_VERSION: str = "5.5"
|
RAYLIB_VERSION: str = "5.0"
|
||||||
PI: float = 3.141592653589793
|
PI: float = 3.141592653589793
|
||||||
DEG2RAD = PI / 180.0
|
DEG2RAD = PI / 180.0
|
||||||
RAD2DEG = 180.0 / PI
|
RAD2DEG = 180.0 / PI
|
||||||
|
@ -14,8 +14,11 @@ MATERIAL_MAP_DIFFUSE = raylib.MATERIAL_MAP_ALBEDO
|
||||||
MATERIAL_MAP_SPECULAR = raylib.MATERIAL_MAP_METALNESS
|
MATERIAL_MAP_SPECULAR = raylib.MATERIAL_MAP_METALNESS
|
||||||
SHADER_LOC_MAP_DIFFUSE = raylib.SHADER_LOC_MAP_ALBEDO
|
SHADER_LOC_MAP_DIFFUSE = raylib.SHADER_LOC_MAP_ALBEDO
|
||||||
SHADER_LOC_MAP_SPECULAR = raylib.SHADER_LOC_MAP_METALNESS
|
SHADER_LOC_MAP_SPECULAR = raylib.SHADER_LOC_MAP_METALNESS
|
||||||
|
PI: float = 3.141592653589793
|
||||||
EPSILON: float = 1e-06
|
EPSILON: float = 1e-06
|
||||||
RLGL_VERSION: str = "5.0"
|
DEG2RAD = PI / 180.0
|
||||||
|
RAD2DEG = 180.0 / PI
|
||||||
|
RLGL_VERSION: str = "4.5"
|
||||||
RL_DEFAULT_BATCH_BUFFER_ELEMENTS: int = 8192
|
RL_DEFAULT_BATCH_BUFFER_ELEMENTS: int = 8192
|
||||||
RL_DEFAULT_BATCH_BUFFERS: int = 1
|
RL_DEFAULT_BATCH_BUFFERS: int = 1
|
||||||
RL_DEFAULT_BATCH_DRAWCALLS: int = 256
|
RL_DEFAULT_BATCH_DRAWCALLS: int = 256
|
||||||
|
@ -86,19 +89,11 @@ RL_BLEND_SRC_RGB: int = 32969
|
||||||
RL_BLEND_DST_ALPHA: int = 32970
|
RL_BLEND_DST_ALPHA: int = 32970
|
||||||
RL_BLEND_SRC_ALPHA: int = 32971
|
RL_BLEND_SRC_ALPHA: int = 32971
|
||||||
RL_BLEND_COLOR: int = 32773
|
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_DIFFUSE = raylib.RL_SHADER_LOC_MAP_ALBEDO
|
||||||
RL_SHADER_LOC_MAP_SPECULAR = raylib.RL_SHADER_LOC_MAP_METALNESS
|
RL_SHADER_LOC_MAP_SPECULAR = raylib.RL_SHADER_LOC_MAP_METALNESS
|
||||||
|
PI: float = 3.141592653589793
|
||||||
|
DEG2RAD = PI / 180.0
|
||||||
|
RAD2DEG = 180.0 / PI
|
||||||
GL_SHADING_LANGUAGE_VERSION: int = 35724
|
GL_SHADING_LANGUAGE_VERSION: int = 35724
|
||||||
GL_COMPRESSED_RGB_S3TC_DXT1_EXT: int = 33776
|
GL_COMPRESSED_RGB_S3TC_DXT1_EXT: int = 33776
|
||||||
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: int = 33777
|
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: int = 33777
|
||||||
|
@ -113,8 +108,6 @@ GL_COMPRESSED_RGBA_ASTC_4x4_KHR: int = 37808
|
||||||
GL_COMPRESSED_RGBA_ASTC_8x8_KHR: int = 37815
|
GL_COMPRESSED_RGBA_ASTC_8x8_KHR: int = 37815
|
||||||
GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: int = 34047
|
GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: int = 34047
|
||||||
GL_TEXTURE_MAX_ANISOTROPY_EXT: int = 34046
|
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_6_5: int = 33635
|
||||||
GL_UNSIGNED_SHORT_5_5_5_1: int = 32820
|
GL_UNSIGNED_SHORT_5_5_5_1: int = 32820
|
||||||
GL_UNSIGNED_SHORT_4_4_4_4: int = 32819
|
GL_UNSIGNED_SHORT_4_4_4_4: int = 32819
|
||||||
|
@ -126,22 +119,19 @@ RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL: str = "vertexNormal"
|
||||||
RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR: str = "vertexColor"
|
RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR: str = "vertexColor"
|
||||||
RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT: str = "vertexTangent"
|
RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT: str = "vertexTangent"
|
||||||
RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2: str = "vertexTexCoord2"
|
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_MVP: str = "mvp"
|
||||||
RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW: str = "matView"
|
RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW: str = "matView"
|
||||||
RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION: str = "matProjection"
|
RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION: str = "matProjection"
|
||||||
RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL: str = "matModel"
|
RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL: str = "matModel"
|
||||||
RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL: str = "matNormal"
|
RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL: str = "matNormal"
|
||||||
RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR: str = "colDiffuse"
|
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_TEXTURE0: str = "texture0"
|
||||||
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1: str = "texture1"
|
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1: str = "texture1"
|
||||||
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2: str = "texture2"
|
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2: str = "texture2"
|
||||||
RAYGUI_VERSION_MAJOR: int = 4
|
RAYGUI_VERSION_MAJOR: int = 4
|
||||||
RAYGUI_VERSION_MINOR: int = 5
|
RAYGUI_VERSION_MINOR: int = 0
|
||||||
RAYGUI_VERSION_PATCH: int = 0
|
RAYGUI_VERSION_PATCH: int = 0
|
||||||
RAYGUI_VERSION: str = "4.5-dev"
|
RAYGUI_VERSION: str = "4.0"
|
||||||
SCROLLBAR_LEFT_SIDE: int = 0
|
SCROLLBAR_LEFT_SIDE: int = 0
|
||||||
SCROLLBAR_RIGHT_SIDE: int = 1
|
SCROLLBAR_RIGHT_SIDE: int = 1
|
||||||
RAYGUI_ICON_SIZE: int = 16
|
RAYGUI_ICON_SIZE: int = 16
|
||||||
|
@ -165,7 +155,6 @@ RAYGUI_PANEL_BORDER_WIDTH: int = 1
|
||||||
RAYGUI_TABBAR_ITEM_WIDTH: int = 160
|
RAYGUI_TABBAR_ITEM_WIDTH: int = 160
|
||||||
RAYGUI_MIN_SCROLLBAR_WIDTH: int = 40
|
RAYGUI_MIN_SCROLLBAR_WIDTH: int = 40
|
||||||
RAYGUI_MIN_SCROLLBAR_HEIGHT: int = 40
|
RAYGUI_MIN_SCROLLBAR_HEIGHT: int = 40
|
||||||
RAYGUI_MIN_MOUSE_WHEEL_SPEED: int = 20
|
|
||||||
RAYGUI_TOGGLEGROUP_MAX_ITEMS: int = 32
|
RAYGUI_TOGGLEGROUP_MAX_ITEMS: int = 32
|
||||||
RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN: int = 40
|
RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN: int = 40
|
||||||
RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY: int = 1
|
RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY: int = 1
|
||||||
|
@ -186,10 +175,12 @@ RAYGUI_TEXTFORMAT_MAX_SIZE: int = 256
|
||||||
PHYSAC_MAX_BODIES: int = 64
|
PHYSAC_MAX_BODIES: int = 64
|
||||||
PHYSAC_MAX_MANIFOLDS: int = 4096
|
PHYSAC_MAX_MANIFOLDS: int = 4096
|
||||||
PHYSAC_MAX_VERTICES: int = 24
|
PHYSAC_MAX_VERTICES: int = 24
|
||||||
PHYSAC_CIRCLE_VERTICES: int = 24
|
PHYSAC_DEFAULT_CIRCLE_VERTICES: int = 24
|
||||||
PHYSAC_COLLISION_ITERATIONS: int = 20
|
PHYSAC_COLLISION_ITERATIONS: int = 100
|
||||||
PHYSAC_PENETRATION_ALLOWANCE: float = 0.05
|
PHYSAC_PENETRATION_ALLOWANCE: float = 0.05
|
||||||
PHYSAC_PENETRATION_CORRECTION: float = 0.4
|
PHYSAC_PENETRATION_CORRECTION: float = 0.4
|
||||||
|
PHYSAC_PI: float = 3.141592653589793
|
||||||
|
PHYSAC_DEG2RAD = PHYSAC_PI / 180.0
|
||||||
PHYSAC_FLT_MAX: float = 3.402823466e+38
|
PHYSAC_FLT_MAX: float = 3.402823466e+38
|
||||||
PHYSAC_EPSILON: float = 1e-06
|
PHYSAC_EPSILON: float = 1e-06
|
||||||
GLFW_VERSION_MAJOR: int = 3
|
GLFW_VERSION_MAJOR: int = 3
|
||||||
|
@ -438,14 +429,12 @@ GLFW_CONTEXT_RELEASE_BEHAVIOR: int = 139273
|
||||||
GLFW_CONTEXT_NO_ERROR: int = 139274
|
GLFW_CONTEXT_NO_ERROR: int = 139274
|
||||||
GLFW_CONTEXT_CREATION_API: int = 139275
|
GLFW_CONTEXT_CREATION_API: int = 139275
|
||||||
GLFW_SCALE_TO_MONITOR: int = 139276
|
GLFW_SCALE_TO_MONITOR: int = 139276
|
||||||
GLFW_SCALE_FRAMEBUFFER: int = 139277
|
|
||||||
GLFW_COCOA_RETINA_FRAMEBUFFER: int = 143361
|
GLFW_COCOA_RETINA_FRAMEBUFFER: int = 143361
|
||||||
GLFW_COCOA_FRAME_NAME: int = 143362
|
GLFW_COCOA_FRAME_NAME: int = 143362
|
||||||
GLFW_COCOA_GRAPHICS_SWITCHING: int = 143363
|
GLFW_COCOA_GRAPHICS_SWITCHING: int = 143363
|
||||||
GLFW_X11_CLASS_NAME: int = 147457
|
GLFW_X11_CLASS_NAME: int = 147457
|
||||||
GLFW_X11_INSTANCE_NAME: int = 147458
|
GLFW_X11_INSTANCE_NAME: int = 147458
|
||||||
GLFW_WIN32_KEYBOARD_MENU: int = 151553
|
GLFW_WIN32_KEYBOARD_MENU: int = 151553
|
||||||
GLFW_WIN32_SHOWDEFAULT: int = 151554
|
|
||||||
GLFW_WAYLAND_APP_ID: int = 155649
|
GLFW_WAYLAND_APP_ID: int = 155649
|
||||||
GLFW_NO_API: int = 0
|
GLFW_NO_API: int = 0
|
||||||
GLFW_OPENGL_API: int = 196609
|
GLFW_OPENGL_API: int = 196609
|
||||||
|
@ -478,8 +467,6 @@ GLFW_ANGLE_PLATFORM_TYPE_D3D9: int = 225284
|
||||||
GLFW_ANGLE_PLATFORM_TYPE_D3D11: int = 225285
|
GLFW_ANGLE_PLATFORM_TYPE_D3D11: int = 225285
|
||||||
GLFW_ANGLE_PLATFORM_TYPE_VULKAN: int = 225287
|
GLFW_ANGLE_PLATFORM_TYPE_VULKAN: int = 225287
|
||||||
GLFW_ANGLE_PLATFORM_TYPE_METAL: int = 225288
|
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_ANY_POSITION: int = 2147483648
|
||||||
GLFW_ARROW_CURSOR: int = 221185
|
GLFW_ARROW_CURSOR: int = 221185
|
||||||
GLFW_IBEAM_CURSOR: int = 221186
|
GLFW_IBEAM_CURSOR: int = 221186
|
||||||
|
@ -499,7 +486,6 @@ GLFW_PLATFORM: int = 327683
|
||||||
GLFW_COCOA_CHDIR_RESOURCES: int = 331777
|
GLFW_COCOA_CHDIR_RESOURCES: int = 331777
|
||||||
GLFW_COCOA_MENUBAR: int = 331778
|
GLFW_COCOA_MENUBAR: int = 331778
|
||||||
GLFW_X11_XCB_VULKAN_SURFACE: int = 335873
|
GLFW_X11_XCB_VULKAN_SURFACE: int = 335873
|
||||||
GLFW_WAYLAND_LIBDECOR: int = 339969
|
|
||||||
GLFW_ANY_PLATFORM: int = 393216
|
GLFW_ANY_PLATFORM: int = 393216
|
||||||
GLFW_PLATFORM_WIN32: int = 393217
|
GLFW_PLATFORM_WIN32: int = 393217
|
||||||
GLFW_PLATFORM_COCOA: int = 393218
|
GLFW_PLATFORM_COCOA: int = 393218
|
||||||
|
|
|
@ -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
|
||||||
|
@ -20,7 +19,6 @@ class ConfigFlags(IntEnum):
|
||||||
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 +29,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 +136,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 +150,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 +163,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 +183,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 +191,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 +204,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 +230,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 +243,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
|
||||||
|
@ -290,7 +275,6 @@ class PixelFormat(IntEnum):
|
||||||
PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 24
|
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 +283,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
|
||||||
|
@ -331,7 +312,6 @@ class BlendMode(IntEnum):
|
||||||
BLEND_CUSTOM_SEPARATE = 7
|
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 +325,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 +332,36 @@ 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):
|
class GuiTextAlignmentVertical(IntEnum):
|
||||||
"""Gui control text alignment vertical."""
|
|
||||||
TEXT_ALIGN_TOP = 0
|
TEXT_ALIGN_TOP = 0
|
||||||
TEXT_ALIGN_MIDDLE = 1
|
TEXT_ALIGN_MIDDLE = 1
|
||||||
TEXT_ALIGN_BOTTOM = 2
|
TEXT_ALIGN_BOTTOM = 2
|
||||||
|
|
||||||
class GuiTextWrapMode(IntEnum):
|
class GuiTextWrapMode(IntEnum):
|
||||||
"""Gui control text wrap mode."""
|
|
||||||
TEXT_WRAP_NONE = 0
|
TEXT_WRAP_NONE = 0
|
||||||
TEXT_WRAP_CHAR = 1
|
TEXT_WRAP_CHAR = 1
|
||||||
TEXT_WRAP_WORD = 2
|
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 +380,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
|
||||||
|
@ -426,7 +397,6 @@ class GuiControlProperty(IntEnum):
|
||||||
TEXT_ALIGNMENT = 14
|
TEXT_ALIGNMENT = 14
|
||||||
|
|
||||||
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
|
||||||
|
@ -436,20 +406,16 @@ class GuiDefaultProperty(IntEnum):
|
||||||
TEXT_WRAP_MODE = 22
|
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 +424,30 @@ 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_READONLY = 16
|
TEXT_READONLY = 16
|
||||||
|
|
||||||
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 +455,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
|
||||||
|
@ -720,15 +675,15 @@ class GuiIconName(IntEnum):
|
||||||
ICON_FOLDER = 217
|
ICON_FOLDER = 217
|
||||||
ICON_FILE = 218
|
ICON_FILE = 218
|
||||||
ICON_SAND_TIMER = 219
|
ICON_SAND_TIMER = 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.
|
@ -1 +0,0 @@
|
||||||
../../raylib/raylib.h.modified
|
|
1409
dynamic/raylib/raylib_modified.h
Normal file
1409
dynamic/raylib/raylib_modified.h
Normal file
File diff suppressed because it is too large
Load diff
|
@ -21,7 +21,7 @@ model.materials.maps[pr.MATERIAL_MAP_ALBEDO].texture = texture
|
||||||
pr.unload_image(image)
|
pr.unload_image(image)
|
||||||
|
|
||||||
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():
|
||||||
|
@ -36,6 +36,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()
|
||||||
|
|
|
@ -6,6 +6,26 @@ raylib [audio] example - playing
|
||||||
import dataclasses
|
import dataclasses
|
||||||
import pyray
|
import pyray
|
||||||
import raylib as rl
|
import raylib as rl
|
||||||
|
from raylib.colors import (
|
||||||
|
RAYWHITE,
|
||||||
|
ORANGE,
|
||||||
|
RED,
|
||||||
|
GOLD,
|
||||||
|
LIME,
|
||||||
|
BLUE,
|
||||||
|
VIOLET,
|
||||||
|
BROWN,
|
||||||
|
LIGHTGRAY,
|
||||||
|
PINK,
|
||||||
|
YELLOW,
|
||||||
|
GREEN,
|
||||||
|
SKYBLUE,
|
||||||
|
PURPLE,
|
||||||
|
BEIGE,
|
||||||
|
MAROON,
|
||||||
|
GRAY,
|
||||||
|
BLACK
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
MAX_CIRCLES=64
|
MAX_CIRCLES=64
|
||||||
|
@ -13,11 +33,12 @@ MAX_CIRCLES=64
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class CircleWave:
|
class CircleWave:
|
||||||
position: pyray.Vector2
|
position: 'rl.Vector2'
|
||||||
radius: float
|
radius: float
|
||||||
alpha: float
|
alpha: float
|
||||||
speed: float
|
speed: float
|
||||||
color: pyray.Color
|
color: 'rl.Color'
|
||||||
|
|
||||||
|
|
||||||
screenWidth = 800
|
screenWidth = 800
|
||||||
screenHeight = 450
|
screenHeight = 450
|
||||||
|
@ -28,8 +49,8 @@ rl.InitWindow(screenWidth, screenHeight, b"raylib [audio] example - module playi
|
||||||
|
|
||||||
rl.InitAudioDevice() # Initialize audio device
|
rl.InitAudioDevice() # Initialize audio device
|
||||||
|
|
||||||
colors = [pyray.ORANGE, pyray.RED, pyray.GOLD, pyray.LIME, pyray.BLUE, pyray.VIOLET, pyray.BROWN, pyray.LIGHTGRAY, pyray.PINK,
|
colors = [ ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK,
|
||||||
pyray.YELLOW, pyray.GREEN, pyray.SKYBLUE, pyray.PURPLE, pyray.BEIGE]
|
YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE ]
|
||||||
|
|
||||||
# Creates some circles for visual effect
|
# Creates some circles for visual effect
|
||||||
circles = []
|
circles = []
|
||||||
|
@ -120,23 +141,23 @@ while not rl.WindowShouldClose(): # Detect window close button or ESC key
|
||||||
#----------------------------------------------------------------------------------
|
#----------------------------------------------------------------------------------
|
||||||
pyray.begin_drawing()
|
pyray.begin_drawing()
|
||||||
|
|
||||||
pyray.clear_background(pyray.RAYWHITE)
|
pyray.clear_background(RAYWHITE)
|
||||||
|
|
||||||
for i in range(MAX_CIRCLES):
|
for i in range(MAX_CIRCLES):
|
||||||
pyray.draw_circle_v(circles[i].position, circles[i].radius, pyray.fade(circles[i].color, circles[i].alpha))
|
pyray.draw_circle_v(circles[i].position, circles[i].radius, rl.Fade(circles[i].color, circles[i].alpha))
|
||||||
|
|
||||||
# Draw time bar
|
# Draw time bar
|
||||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.LIGHTGRAY)
|
pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY)
|
||||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, pyray.MAROON)
|
pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, MAROON)
|
||||||
pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.GRAY)
|
pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY)
|
||||||
|
|
||||||
# Draw help instructions
|
# Draw help instructions
|
||||||
pyray.draw_rectangle(20, 20, 425, 145, pyray.RAYWHITE)
|
pyray.draw_rectangle(20, 20, 425, 145, RAYWHITE)
|
||||||
pyray.draw_rectangle_lines(20, 20, 425, 145, pyray.GRAY)
|
pyray.draw_rectangle_lines(20, 20, 425, 145, GRAY)
|
||||||
pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, pyray.BLACK)
|
pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, BLACK)
|
||||||
pyray.draw_text("PRESS P TO PAUSE/RESUME", 40, 70, 20, pyray.BLACK)
|
pyray.draw_text("PRESS P TO PAUSE/RESUME", 40, 70, 20, BLACK)
|
||||||
pyray.draw_text("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, pyray.BLACK)
|
pyray.draw_text("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, BLACK)
|
||||||
pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, pyray.MAROON)
|
pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, MAROON)
|
||||||
|
|
||||||
pyray.end_drawing()
|
pyray.end_drawing()
|
||||||
#----------------------------------------------------------------------------------
|
#----------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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()
|
|
|
@ -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
|
|
||||||
# --------------------------------------------------------------------------------------
|
|
|
@ -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
|
|
||||||
# --------------------------------------------------------------------------------------
|
|
|
@ -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.
|
@ -57,18 +57,18 @@ 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 +86,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
|
||||||
|
|
||||||
|
|
|
@ -13,14 +13,15 @@ pyray.set_target_fps(60)
|
||||||
|
|
||||||
camera = pyray.Camera2D()
|
camera = pyray.Camera2D()
|
||||||
|
|
||||||
|
camera = pyray.Camera2D()
|
||||||
camera.zoom = 1.0
|
camera.zoom = 1.0
|
||||||
|
|
||||||
pyray.set_target_fps(60)
|
pyray.set_target_fps(60);
|
||||||
|
|
||||||
# main game loop
|
# main game loop
|
||||||
while not pyray.window_should_close():
|
while not pyray.window_should_close():
|
||||||
# update
|
# update
|
||||||
if pyray.is_mouse_button_down(pyray.MouseButton.MOUSE_BUTTON_RIGHT):
|
if pyray.is_mouse_button_down(pyray.MOUSE_BUTTON_RIGHT):
|
||||||
delta = pyray.get_mouse_delta()
|
delta = pyray.get_mouse_delta()
|
||||||
delta = pyray.vector2_scale(delta, -1.0 / camera.zoom)
|
delta = pyray.vector2_scale(delta, -1.0 / camera.zoom)
|
||||||
camera.target = pyray.vector2_add(camera.target, delta)
|
camera.target = pyray.vector2_add(camera.target, delta)
|
||||||
|
@ -57,7 +58,7 @@ while not pyray.window_should_close():
|
||||||
|
|
||||||
pyray.end_mode_2d()
|
pyray.end_mode_2d()
|
||||||
|
|
||||||
pyray.draw_text("Mouse right button drag to move, mouse wheel to zoom", 10, 10, 20, pyray.WHITE)
|
pyray.draw_text("Mouse right button drag to move, mouse wheel to zoom", 10, 10, 20, pyray.WHITE);
|
||||||
|
|
||||||
pyray.end_drawing()
|
pyray.end_drawing()
|
||||||
|
|
||||||
|
|
|
@ -62,11 +62,11 @@ class EnvItem:
|
||||||
|
|
||||||
|
|
||||||
def update_player(player, env_items, delta):
|
def update_player(player, env_items, delta):
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_LEFT):
|
if pyray.is_key_down(pyray.KEY_LEFT):
|
||||||
player.position.x -= PLAYER_HOR_SPD * delta
|
player.position.x -= PLAYER_HOR_SPD * delta
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT):
|
if pyray.is_key_down(pyray.KEY_RIGHT):
|
||||||
player.position.x += PLAYER_HOR_SPD * delta
|
player.position.x += PLAYER_HOR_SPD * delta
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_SPACE) and player.can_jump:
|
if pyray.is_key_down(pyray.KEY_SPACE) and player.can_jump:
|
||||||
player.speed = -PLAYER_JUMP_SPD
|
player.speed = -PLAYER_JUMP_SPD
|
||||||
player.can_jump = False
|
player.can_jump = False
|
||||||
|
|
||||||
|
@ -264,11 +264,11 @@ while not pyray.window_should_close(): # Detect window close button or ESC key
|
||||||
elif camera.zoom < 0.25:
|
elif camera.zoom < 0.25:
|
||||||
camera.zoom = 0.25
|
camera.zoom = 0.25
|
||||||
|
|
||||||
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
|
||||||
player.position = pyray.Vector2(400, 280)
|
player.position = pyray.Vector2(400, 280)
|
||||||
|
|
||||||
if pyray.is_key_pressed(pyray.KeyboardKey.KEY_C):
|
if pyray.is_key_pressed(pyray.KEY_C):
|
||||||
camera_option = (camera_option + 1) % camera_updaters_length
|
camera_option = (camera_option + 1) % camera_updaters_length
|
||||||
|
|
||||||
# Call update camera function by its pointer
|
# Call update camera function by its pointer
|
||||||
|
|
|
@ -10,7 +10,7 @@ MAX_COLUMNS = 20
|
||||||
SCREEN_WIDTH = 800
|
SCREEN_WIDTH = 800
|
||||||
SCREEN_HEIGHT = 450
|
SCREEN_HEIGHT = 450
|
||||||
|
|
||||||
pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [core] example - 3d camera first person")
|
pyray.init_window(SCREEN_WIDTH, SCREEN_HEIGHT, b"raylib [core] example - 3d camera first person")
|
||||||
|
|
||||||
# Define the camera to look into our 3d world (position, target, up vector)
|
# Define the camera to look into our 3d world (position, target, up vector)
|
||||||
camera = pyray.Camera3D()
|
camera = pyray.Camera3D()
|
||||||
|
@ -18,24 +18,24 @@ camera.position = pyray.Vector3(4.0, 2.0, 4.0)
|
||||||
camera.target = pyray.Vector3(0.0, 1.8, 0.0)
|
camera.target = pyray.Vector3(0.0, 1.8, 0.0)
|
||||||
camera.up = pyray.Vector3(0.0, 1.0, 0.0)
|
camera.up = pyray.Vector3(0.0, 1.0, 0.0)
|
||||||
camera.fovy = 60.0
|
camera.fovy = 60.0
|
||||||
camera.projection = pyray.CameraProjection.CAMERA_PERSPECTIVE
|
camera.projection = pyray.CAMERA_PERSPECTIVE
|
||||||
|
|
||||||
# Generates some random columns
|
# Generates some random columns
|
||||||
heights = []
|
heights = [None] * MAX_COLUMNS
|
||||||
positions = []
|
positions = [None] * MAX_COLUMNS
|
||||||
colors = []
|
colors = [None] * MAX_COLUMNS
|
||||||
|
|
||||||
for i in range(MAX_COLUMNS):
|
for i in range(MAX_COLUMNS):
|
||||||
heights.append(pyray.get_random_value(1, 12) * 1.0)
|
heights[i] = pyray.get_random_value(1, 12) * 1.0
|
||||||
positions.append(pyray.Vector3(pyray.get_random_value(-15, 15) * 1.0, heights[i]/2.0 * 1.0, pyray.get_random_value(-15, 15) * 1.0))
|
positions[i] = pyray.Vector3(pyray.get_random_value(-15, 15) * 1.0, heights[i]/2.0 * 1.0, pyray.get_random_value(-15, 15) * 1.0)
|
||||||
colors.append(pyray.Color(pyray.get_random_value(20, 255), pyray.get_random_value(10, 55), 30, 255))
|
colors[i] = pyray.Color(pyray.get_random_value(20, 255), pyray.get_random_value(10, 55), 30, 255)
|
||||||
|
|
||||||
|
|
||||||
pyray.set_target_fps(60)
|
pyray.set_target_fps(60)
|
||||||
|
|
||||||
while not pyray.window_should_close():
|
while not pyray.window_should_close():
|
||||||
|
|
||||||
pyray.update_camera(camera, pyray.CameraMode.CAMERA_FIRST_PERSON)
|
pyray.update_camera(camera, pyray.CAMERA_FIRST_PERSON)
|
||||||
|
|
||||||
pyray.begin_drawing()
|
pyray.begin_drawing()
|
||||||
|
|
|
@ -25,7 +25,7 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
# Update
|
# Update
|
||||||
update_camera(camera, CameraMode.CAMERA_FREE)
|
update_camera(camera, CameraMode.CAMERA_FREE)
|
||||||
|
|
||||||
if is_key_pressed(KeyboardKey.KEY_Z):
|
if is_key_pressed(KEY_Z):
|
||||||
camera.target = Vector3(0.0, 0.0, 0.0)
|
camera.target = Vector3(0.0, 0.0, 0.0)
|
||||||
|
|
||||||
# Draw
|
# Draw
|
|
@ -40,7 +40,7 @@ while not pyray.window_should_close():
|
||||||
|
|
||||||
pyray.end_mode_3d()
|
pyray.end_mode_3d()
|
||||||
|
|
||||||
pyray.draw_text("Welcome to the third dimension!", 10, 40, 20, pyray.DARKGRAY)
|
pyray.draw_text("Welcome to the third dimension!", 10, 40, 20, pyray.DARKGRAY);
|
||||||
|
|
||||||
pyray.draw_fps(10, 10)
|
pyray.draw_fps(10, 10)
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,13 @@ def main():
|
||||||
if frame_count > 120:
|
if frame_count > 120:
|
||||||
current_screen = GameScreen.TITLE
|
current_screen = GameScreen.TITLE
|
||||||
elif current_screen == GameScreen.TITLE:
|
elif current_screen == GameScreen.TITLE:
|
||||||
if is_key_pressed(KeyboardKey.KEY_ENTER) or is_gesture_detected(Gesture.GESTURE_TAP):
|
if is_key_pressed(KEY_ENTER) or is_gesture_detected(GESTURE_TAP):
|
||||||
current_screen = GameScreen.GAMEPLAY
|
current_screen = GameScreen.GAMEPLAY
|
||||||
elif current_screen == GameScreen.GAMEPLAY:
|
elif current_screen == GameScreen.GAMEPLAY:
|
||||||
if is_key_pressed(KeyboardKey.KEY_ENTER) or is_gesture_detected(Gesture.GESTURE_TAP):
|
if is_key_pressed(KEY_ENTER) or is_gesture_detected(GESTURE_TAP):
|
||||||
current_screen = GameScreen.ENDING
|
current_screen = GameScreen.ENDING
|
||||||
elif current_screen == GameScreen.ENDING:
|
elif current_screen == GameScreen.ENDING:
|
||||||
if is_key_pressed(KeyboardKey.KEY_ENTER) or is_gesture_detected(Gesture.GESTURE_TAP):
|
if is_key_pressed(KEY_ENTER) or is_gesture_detected(GESTURE_TAP):
|
||||||
current_screen = GameScreen.TITLE
|
current_screen = GameScreen.TITLE
|
||||||
|
|
||||||
begin_drawing()
|
begin_drawing()
|
||||||
|
|
|
@ -11,6 +11,12 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import pyray
|
import pyray
|
||||||
|
from raylib.colors import (
|
||||||
|
RAYWHITE,
|
||||||
|
DARKGRAY,
|
||||||
|
LIGHTGRAY,
|
||||||
|
GRAY
|
||||||
|
)
|
||||||
|
|
||||||
screenWidth = 800
|
screenWidth = 800
|
||||||
screenHeight = 450
|
screenHeight = 450
|
||||||
|
@ -30,21 +36,21 @@ while not pyray.window_should_close():
|
||||||
|
|
||||||
pyray.begin_drawing()
|
pyray.begin_drawing()
|
||||||
|
|
||||||
pyray.clear_background(pyray.RAYWHITE)
|
pyray.clear_background(RAYWHITE)
|
||||||
|
|
||||||
if droppedFiles.count == 0:
|
if droppedFiles.count == 0:
|
||||||
pyray.draw_text("Drop your files to this window!", 100, 40, 20, pyray.DARKGRAY)
|
pyray.draw_text("Drop your files to this window!", 100, 40, 20, DARKGRAY)
|
||||||
else:
|
else:
|
||||||
pyray.draw_text("Dropped files:", 100, 40, 20, pyray.DARKGRAY)
|
pyray.draw_text("Dropped files:", 100, 40, 20, DARKGRAY)
|
||||||
|
|
||||||
for i in range(0, droppedFiles.count):
|
for i in range(0, droppedFiles.count):
|
||||||
if i % 2 == 0:
|
if i % 2 == 0:
|
||||||
pyray.draw_rectangle(0, 85 + 40*i, screenWidth, 40, pyray.fade(pyray.LIGHTGRAY, 0.5))
|
pyray.draw_rectangle(0, 85 + 40*i, screenWidth, 40, pyray.fade(LIGHTGRAY, 0.5))
|
||||||
else:
|
else:
|
||||||
pyray.draw_rectangle(0, 85 + 40*i, screenWidth, 40, pyray.fade(pyray.LIGHTGRAY, 0.3))
|
pyray.draw_rectangle(0, 85 + 40*i, screenWidth, 40, pyray.fade(LIGHTGRAY, 0.3))
|
||||||
pyray.draw_text(droppedFiles.paths[i], 120, 100 + 40*i, 10, pyray.GRAY)
|
pyray.draw_text(droppedFiles.paths[i], 120, 100 + 40*i, 10, GRAY)
|
||||||
|
|
||||||
pyray.draw_text("Drop new files...", 100, 110 + 40*droppedFiles.count, 20, pyray.DARKGRAY)
|
pyray.draw_text("Drop new files...", 100, 110 + 40*droppedFiles.count, 20, DARKGRAY)
|
||||||
pyray.end_drawing()
|
pyray.end_drawing()
|
||||||
|
|
||||||
# De-Initialization
|
# De-Initialization
|
||||||
|
|
|
@ -4,6 +4,13 @@ raylib [core] example - Input Gestures Detection
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import pyray
|
import pyray
|
||||||
|
from raylib.colors import (
|
||||||
|
RAYWHITE,
|
||||||
|
LIGHTGRAY,
|
||||||
|
DARKGRAY,
|
||||||
|
MAROON,
|
||||||
|
GRAY,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,20 +26,20 @@ touch_area = pyray.Rectangle(220, 10, SCREEN_WIDTH - 230, SCREEN_HEIGHT - 20)
|
||||||
|
|
||||||
gesture_strings = []
|
gesture_strings = []
|
||||||
|
|
||||||
current_gesture = pyray.Gesture.GESTURE_NONE
|
current_gesture = pyray.GESTURE_NONE
|
||||||
last_gesture = pyray.Gesture.GESTURE_NONE
|
last_gesture = pyray.GESTURE_NONE
|
||||||
|
|
||||||
GESTURE_LABELS = {
|
GESTURE_LABELS = {
|
||||||
pyray.Gesture.GESTURE_TAP: 'GESTURE TAP',
|
pyray.GESTURE_TAP: 'GESTURE TAP',
|
||||||
pyray.Gesture.GESTURE_DOUBLETAP: 'GESTURE DOUBLETAP',
|
pyray.GESTURE_DOUBLETAP: 'GESTURE DOUBLETAP',
|
||||||
pyray.Gesture.GESTURE_HOLD: 'GESTURE HOLD',
|
pyray.GESTURE_HOLD: 'GESTURE HOLD',
|
||||||
pyray.Gesture.GESTURE_DRAG: 'GESTURE DRAG',
|
pyray.GESTURE_DRAG: 'GESTURE DRAG',
|
||||||
pyray.Gesture.GESTURE_SWIPE_RIGHT: 'GESTURE SWIPE RIGHT',
|
pyray.GESTURE_SWIPE_RIGHT: 'GESTURE SWIPE RIGHT',
|
||||||
pyray.Gesture.GESTURE_SWIPE_LEFT: 'GESTURE SWIPE LEFT',
|
pyray.GESTURE_SWIPE_LEFT: 'GESTURE SWIPE LEFT',
|
||||||
pyray.Gesture.GESTURE_SWIPE_UP: 'GESTURE SWIPE UP',
|
pyray.GESTURE_SWIPE_UP: 'GESTURE SWIPE UP',
|
||||||
pyray.Gesture.GESTURE_SWIPE_DOWN: 'GESTURE SWIPE DOWN',
|
pyray.GESTURE_SWIPE_DOWN: 'GESTURE SWIPE DOWN',
|
||||||
pyray.Gesture.GESTURE_PINCH_IN: 'GESTURE PINCH IN',
|
pyray.GESTURE_PINCH_IN: 'GESTURE PINCH IN',
|
||||||
pyray.Gesture.GESTURE_PINCH_OUT: 'GESTURE PINCH OUT',
|
pyray.GESTURE_PINCH_OUT: 'GESTURE PINCH OUT',
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
@ -47,7 +54,7 @@ while not pyray.window_should_close(): # Detect window close button or ESC key
|
||||||
|
|
||||||
if (
|
if (
|
||||||
pyray.check_collision_point_rec(touch_position, touch_area)
|
pyray.check_collision_point_rec(touch_position, touch_area)
|
||||||
and current_gesture != pyray.Gesture.GESTURE_NONE
|
and current_gesture != pyray.GESTURE_NONE
|
||||||
):
|
):
|
||||||
if current_gesture != last_gesture:
|
if current_gesture != last_gesture:
|
||||||
gesture_strings.append(GESTURE_LABELS[current_gesture])
|
gesture_strings.append(GESTURE_LABELS[current_gesture])
|
||||||
|
@ -59,34 +66,34 @@ while not pyray.window_should_close(): # Detect window close button or ESC key
|
||||||
# Draw
|
# Draw
|
||||||
pyray.begin_drawing()
|
pyray.begin_drawing()
|
||||||
|
|
||||||
pyray.clear_background(pyray.RAYWHITE)
|
pyray.clear_background(RAYWHITE)
|
||||||
|
|
||||||
pyray.draw_rectangle_rec(touch_area, pyray.GRAY)
|
pyray.draw_rectangle_rec(touch_area, GRAY)
|
||||||
pyray.draw_rectangle(225, 15, SCREEN_WIDTH - 240, SCREEN_HEIGHT - 30,
|
pyray.draw_rectangle(225, 15, SCREEN_WIDTH - 240, SCREEN_HEIGHT - 30,
|
||||||
pyray.RAYWHITE)
|
RAYWHITE)
|
||||||
pyray.draw_text(
|
pyray.draw_text(
|
||||||
'GESTURES TEST AREA',
|
'GESTURES TEST AREA',
|
||||||
SCREEN_WIDTH - 270, SCREEN_HEIGHT - 40, 20, pyray.fade(pyray.GRAY, 0.5)
|
SCREEN_WIDTH - 270, SCREEN_HEIGHT - 40, 20, pyray.fade(GRAY, 0.5)
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, val in enumerate(gesture_strings):
|
for i, val in enumerate(gesture_strings):
|
||||||
if i % 2 == 0:
|
if i % 2 == 0:
|
||||||
pyray.draw_rectangle(
|
pyray.draw_rectangle(
|
||||||
10, 30 + 20 * i, 200, 20, pyray.fade(pyray.LIGHTGRAY, 0.5))
|
10, 30 + 20 * i, 200, 20, pyray.fade(LIGHTGRAY, 0.5))
|
||||||
else:
|
else:
|
||||||
pyray.draw_rectangle(
|
pyray.draw_rectangle(
|
||||||
10, 30 + 20 * i, 200, 20, pyray.fade(pyray.LIGHTGRAY, 0.3))
|
10, 30 + 20 * i, 200, 20, pyray.fade(LIGHTGRAY, 0.3))
|
||||||
|
|
||||||
if i < len(gesture_strings) - 1:
|
if i < len(gesture_strings) - 1:
|
||||||
pyray.draw_text(val, 35, 36 + 20 * i, 10, pyray.DARKGRAY)
|
pyray.draw_text(val, 35, 36 + 20 * i, 10, DARKGRAY)
|
||||||
else:
|
else:
|
||||||
pyray.draw_text(val, 35, 36 + 20 * i, 10, pyray.MAROON)
|
pyray.draw_text(val, 35, 36 + 20 * i, 10, MAROON)
|
||||||
|
|
||||||
pyray.draw_rectangle_lines(10, 29, 200, SCREEN_HEIGHT - 50, pyray.GRAY)
|
pyray.draw_rectangle_lines(10, 29, 200, SCREEN_HEIGHT - 50, GRAY)
|
||||||
pyray.draw_text('DETECTED GESTURES', 50, 15, 10, pyray.GRAY)
|
pyray.draw_text('DETECTED GESTURES', 50, 15, 10, GRAY)
|
||||||
|
|
||||||
if current_gesture != pyray.Gesture.GESTURE_NONE:
|
if current_gesture != pyray.GESTURE_NONE:
|
||||||
pyray.draw_circle_v(touch_position, 30, pyray.MAROON)
|
pyray.draw_circle_v(touch_position, 30, MAROON)
|
||||||
|
|
||||||
pyray.end_drawing()
|
pyray.end_drawing()
|
||||||
|
|
||||||
|
|
|
@ -19,13 +19,13 @@ 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
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT):
|
if pyray.is_key_down(pyray.KEY_RIGHT):
|
||||||
ball_position.x += 2
|
ball_position.x += 2
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_LEFT):
|
if pyray.is_key_down(pyray.KEY_LEFT):
|
||||||
ball_position.x -= 2
|
ball_position.x -= 2
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_UP):
|
if pyray.is_key_down(pyray.KEY_UP):
|
||||||
ball_position.y -= 2
|
ball_position.y -= 2
|
||||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_DOWN):
|
if pyray.is_key_down(pyray.KEY_DOWN):
|
||||||
ball_position.y += 2
|
ball_position.y += 2
|
||||||
|
|
||||||
# Draw
|
# Draw
|
||||||
|
|
|
@ -22,19 +22,19 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
# Update
|
# Update
|
||||||
ball_position = get_mouse_position()
|
ball_position = get_mouse_position()
|
||||||
|
|
||||||
if is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_LEFT):
|
if is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
|
||||||
ball_color = MAROON
|
ball_color = MAROON
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_MIDDLE):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_MIDDLE):
|
||||||
ball_color = LIME
|
ball_color = LIME
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_RIGHT):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
|
||||||
ball_color = DARKBLUE
|
ball_color = DARKBLUE
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_SIDE):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_SIDE):
|
||||||
ball_color = PURPLE
|
ball_color = PURPLE
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_EXTRA):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_EXTRA):
|
||||||
ball_color = YELLOW
|
ball_color = YELLOW
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_FORWARD):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_FORWARD):
|
||||||
ball_color = ORANGE
|
ball_color = ORANGE
|
||||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_BACK):
|
elif is_mouse_button_pressed(MOUSE_BUTTON_BACK):
|
||||||
ball_color = BEIGE
|
ball_color = BEIGE
|
||||||
# Draw
|
# Draw
|
||||||
begin_drawing()
|
begin_drawing()
|
||||||
|
|
|
@ -23,7 +23,7 @@ set_target_fps(60) # Set our game to run at 60 frames-per-second
|
||||||
while not window_should_close(): # Detect window close button or ESC key
|
while not window_should_close(): # Detect window close button or ESC key
|
||||||
# Update
|
# Update
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
if is_key_pressed(KeyboardKey.KEY_S):
|
if is_key_pressed(KEY_S):
|
||||||
scissorMode = not scissorMode
|
scissorMode = not scissorMode
|
||||||
|
|
||||||
# Centre the scissor area around the mouse position
|
# Centre the scissor area around the mouse position
|
||||||
|
|
|
@ -18,7 +18,7 @@ worldSpaceCamera.zoom = 1.0
|
||||||
screenSpaceCamera = Camera2D([0]) # Smoothing camera
|
screenSpaceCamera = Camera2D([0]) # Smoothing camera
|
||||||
screenSpaceCamera.zoom = 1.0
|
screenSpaceCamera.zoom = 1.0
|
||||||
|
|
||||||
target = load_render_texture(virtualScreenWidth, virtualScreenHeight) # This is where we'll draw all our objects.
|
target = load_render_texture(virtualScreenWidth, virtualScreenHeight); # This is where we'll draw all our objects.
|
||||||
|
|
||||||
rec01 = Rectangle(70.0, 35.0, 20.0, 20.0)
|
rec01 = Rectangle(70.0, 35.0, 20.0, 20.0)
|
||||||
rec02 = Rectangle(90.0, 55.0, 30.0, 10.0)
|
rec02 = Rectangle(90.0, 55.0, 30.0, 10.0)
|
||||||
|
@ -42,7 +42,7 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
|
|
||||||
# Update
|
# Update
|
||||||
|
|
||||||
rotation += 60.0 *get_frame_time() # Rotate the rectangles, 60 degrees per second
|
rotation += 60.0 *get_frame_time(); # Rotate the rectangles, 60 degrees per second
|
||||||
|
|
||||||
# Make the camera move to demonstrate the effect
|
# Make the camera move to demonstrate the effect
|
||||||
cameraX = (math.sin(get_time())*50.0) - 10.0
|
cameraX = (math.sin(get_time())*50.0) - 10.0
|
||||||
|
@ -77,8 +77,8 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
draw_texture_pro(target.texture, sourceRec, destRec, origin, 0.0, WHITE)
|
draw_texture_pro(target.texture, sourceRec, destRec, origin, 0.0, WHITE)
|
||||||
end_mode_2d()
|
end_mode_2d()
|
||||||
|
|
||||||
draw_text(f"Screen resolution: {screenWidth}, {screenHeight}", 10, 10, 20, DARKBLUE)
|
draw_text(text_format("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, DARKBLUE)
|
||||||
draw_text(f"World resolution: {virtualScreenWidth}, {virtualScreenHeight}", 10, 40, 20, DARKGREEN)
|
draw_text(text_format("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, DARKGREEN)
|
||||||
draw_fps(get_screen_width() - 95, 10)
|
draw_fps(get_screen_width() - 95, 10)
|
||||||
end_drawing()
|
end_drawing()
|
||||||
|
|
||||||
|
|
|
@ -66,21 +66,21 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
|
|
||||||
# Move Player1 forward and backwards (no turning)
|
# Move Player1 forward and backwards (no turning)
|
||||||
|
|
||||||
if is_key_down(KeyboardKey.KEY_W):
|
if is_key_down(KEY_W):
|
||||||
cameraPlayer1.position.z += offsetThisFrame
|
cameraPlayer1.position.z += offsetThisFrame
|
||||||
cameraPlayer1.target.z += offsetThisFrame
|
cameraPlayer1.target.z += offsetThisFrame
|
||||||
|
|
||||||
elif is_key_down(KeyboardKey.KEY_S):
|
elif is_key_down(KEY_S):
|
||||||
|
|
||||||
cameraPlayer1.position.z -= offsetThisFrame
|
cameraPlayer1.position.z -= offsetThisFrame
|
||||||
cameraPlayer1.target.z -= offsetThisFrame
|
cameraPlayer1.target.z -= offsetThisFrame
|
||||||
|
|
||||||
# Move Player2 forward and backwards (no turning)
|
# Move Player2 forward and backwards (no turning)
|
||||||
if is_key_down(KeyboardKey.KEY_UP):
|
if is_key_down(KEY_UP):
|
||||||
cameraPlayer2.position.x += offsetThisFrame
|
cameraPlayer2.position.x += offsetThisFrame
|
||||||
cameraPlayer2.target.x += offsetThisFrame
|
cameraPlayer2.target.x += offsetThisFrame
|
||||||
|
|
||||||
elif is_key_down(KeyboardKey.KEY_DOWN):
|
elif is_key_down(KEY_DOWN):
|
||||||
cameraPlayer2.position
|
cameraPlayer2.position
|
||||||
cameraPlayer2.position.x -= offsetThisFrame
|
cameraPlayer2.position.x -= offsetThisFrame
|
||||||
cameraPlayer2.target.x -= offsetThisFrame
|
cameraPlayer2.target.x -= offsetThisFrame
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import pyray
|
import pyray
|
||||||
import raylib
|
|
||||||
|
|
||||||
GLSL_VERSION = 330
|
GLSL_VERSION = 330
|
||||||
|
|
||||||
# Initialization
|
# Initialization
|
||||||
|
@ -17,6 +15,7 @@ device = pyray.VrDeviceInfo(
|
||||||
1200, # Vertical resolution in pixels
|
1200, # Vertical resolution in pixels
|
||||||
0.133793, # Horizontal size in meters
|
0.133793, # Horizontal size in meters
|
||||||
0.0669, # Vertical size in meters
|
0.0669, # Vertical size in meters
|
||||||
|
0.04678, # Screen center in meters
|
||||||
0.041, # Distance between eye and display in meters
|
0.041, # Distance between eye and display in meters
|
||||||
0.07, # Lens separation distance in meters
|
0.07, # Lens separation distance in meters
|
||||||
0.07, # IPD (distance between pupils) in meters
|
0.07, # IPD (distance between pupils) in meters
|
||||||
|
@ -31,18 +30,18 @@ device = pyray.VrDeviceInfo(
|
||||||
config = pyray.load_vr_stereo_config(device)
|
config = pyray.load_vr_stereo_config(device)
|
||||||
|
|
||||||
# Distortion shader (uses device lens distortion and chroma)
|
# Distortion shader (uses device lens distortion and chroma)
|
||||||
distortion = pyray.load_shader(pyray.ffi.NULL, f"resources/distortion{GLSL_VERSION}.fs")
|
distortion = pyray.load_shader(0, f"resources/distortion{GLSL_VERSION}.fs")
|
||||||
|
|
||||||
# Update distortion shader with lens and distortion-scale parameters
|
# Update distortion shader with lens and distortion-scale parameters
|
||||||
pyray.set_shader_value(distortion, 2, pyray.ffi.new('char []', b"leftLensCenter"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"leftLensCenter", pyray.SHADER_UNIFORM_VEC2)
|
||||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"rightLensCenter"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"rightLensCenter", pyray.SHADER_UNIFORM_VEC2)
|
||||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"leftScreenCenter"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"leftScreenCenter", pyray.SHADER_UNIFORM_VEC2)
|
||||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"rightScreenCenter"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"rightScreenCenter", pyray.SHADER_UNIFORM_VEC2)
|
||||||
|
|
||||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"scale"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"scale", pyray.SHADER_UNIFORM_VEC2)
|
||||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"scaleIn"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
pyray.set_shader_value(distortion, 2,"scaleIn", pyray.SHADER_UNIFORM_VEC2)
|
||||||
pyray.set_shader_value(distortion, 4,pyray.ffi.new('char []', b"deviceWarpParam"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC4)
|
pyray.set_shader_value(distortion, 4,"deviceWarpParam", pyray.SHADER_UNIFORM_VEC4)
|
||||||
pyray.set_shader_value(distortion, 4,pyray.ffi.new('char []', b"chromaAbParam"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC4)
|
pyray.set_shader_value(distortion, 4,"chromaAbParam", pyray.SHADER_UNIFORM_VEC4)
|
||||||
|
|
||||||
# Initialize framebuffer for stereo rendering
|
# Initialize framebuffer for stereo rendering
|
||||||
# NOTE: Screen size should match HMD aspect ratio
|
# NOTE: Screen size should match HMD aspect ratio
|
||||||
|
@ -58,7 +57,7 @@ camera = pyray.Camera3D(
|
||||||
pyray.Vector3(0.0, 2.0, 0.0), # Camera looking at point
|
pyray.Vector3(0.0, 2.0, 0.0), # Camera looking at point
|
||||||
pyray.Vector3(0.0, 1.0, 0.0), # Camera up vector
|
pyray.Vector3(0.0, 1.0, 0.0), # Camera up vector
|
||||||
60.0, # Camera field-of-view Y
|
60.0, # Camera field-of-view Y
|
||||||
pyray.CameraProjection.CAMERA_PERSPECTIVE # Camera projection type
|
pyray.CAMERA_PERSPECTIVE # Camera projection type
|
||||||
)
|
)
|
||||||
|
|
||||||
cubePosition = pyray.Vector3(0.0, 0.0, 0.0)
|
cubePosition = pyray.Vector3(0.0, 0.0, 0.0)
|
||||||
|
@ -70,7 +69,7 @@ pyray.set_target_fps(90) # Set our game to run at 90 frames-per-sec
|
||||||
# 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
|
||||||
pyray.update_camera(camera, pyray.CameraMode.CAMERA_FIRST_PERSON)
|
pyray.update_camera(camera, pyray.CAMERA_FIRST_PERSON)
|
||||||
|
|
||||||
# Draw
|
# Draw
|
||||||
pyray.begin_texture_mode(target)
|
pyray.begin_texture_mode(target)
|
||||||
|
|
|
@ -6,7 +6,7 @@ import pyray
|
||||||
screen_width = 800
|
screen_width = 800
|
||||||
screen_height = 450
|
screen_height = 450
|
||||||
|
|
||||||
init_window(screen_width, screen_height, "raylib [core] example - window flags")
|
init_window(screen_width, screen_height, b"raylib [core] example - window flags")
|
||||||
|
|
||||||
ball_position = Vector2(get_screen_width() / 2.0, get_screen_height() / 2.0)
|
ball_position = Vector2(get_screen_width() / 2.0, get_screen_height() / 2.0)
|
||||||
ball_speed = Vector2(5.0, 4.0)
|
ball_speed = Vector2(5.0, 4.0)
|
||||||
|
@ -18,71 +18,71 @@ frames_counter = 0
|
||||||
while not window_should_close(): # Detect window close button or ESC key
|
while not window_should_close(): # Detect window close button or ESC key
|
||||||
# Update
|
# Update
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_F):
|
if is_key_pressed(pyray.KEY_F):
|
||||||
toggle_fullscreen()
|
toggle_fullscreen()
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_R):
|
if is_key_pressed(pyray.KEY_R):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE):
|
if is_window_state(pyray.FLAG_WINDOW_RESIZABLE):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE)
|
clear_window_state(pyray.FLAG_WINDOW_RESIZABLE)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE)
|
set_window_state(pyray.FLAG_WINDOW_RESIZABLE)
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_D):
|
if is_key_pressed(pyray.KEY_D):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED):
|
if is_window_state(pyray.FLAG_WINDOW_UNDECORATED):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED)
|
clear_window_state(pyray.FLAG_WINDOW_UNDECORATED)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED)
|
set_window_state(pyray.FLAG_WINDOW_UNDECORATED)
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_H):
|
if is_key_pressed(pyray.KEY_H):
|
||||||
if not is_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN):
|
if not is_window_state(pyray.FLAG_WINDOW_HIDDEN):
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN)
|
set_window_state(pyray.FLAG_WINDOW_HIDDEN)
|
||||||
frames_counter = 0
|
frames_counter = 0
|
||||||
|
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN):
|
if is_window_state(pyray.FLAG_WINDOW_HIDDEN):
|
||||||
frames_counter += 1
|
frames_counter += 1
|
||||||
if frames_counter >= 240:
|
if frames_counter >= 240:
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN) # Show window after 3 seconds
|
clear_window_state(pyray.FLAG_WINDOW_HIDDEN) # Show window after 3 seconds
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_N):
|
if is_key_pressed(pyray.KEY_N):
|
||||||
if not is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED):
|
if not is_window_state(pyray.FLAG_WINDOW_MINIMIZED):
|
||||||
minimize_window()
|
minimize_window()
|
||||||
frames_counter = 0
|
frames_counter = 0
|
||||||
|
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED):
|
if is_window_state(pyray.FLAG_WINDOW_MINIMIZED):
|
||||||
frames_counter += 1
|
frames_counter += 1
|
||||||
if frames_counter >= 240:
|
if frames_counter >= 240:
|
||||||
restore_window() # Restore window after 3 seconds
|
restore_window() # Restore window after 3 seconds
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_M):
|
if is_key_pressed(pyray.KEY_M):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE):
|
if is_window_state(pyray.FLAG_WINDOW_RESIZABLE):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MAXIMIZED):
|
if is_window_state(pyray.FLAG_WINDOW_MAXIMIZED):
|
||||||
restore_window()
|
restore_window()
|
||||||
else:
|
else:
|
||||||
maximize_window()
|
maximize_window()
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_U):
|
if is_key_pressed(pyray.KEY_U):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED):
|
if is_window_state(pyray.FLAG_WINDOW_UNFOCUSED):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED)
|
clear_window_state(pyray.FLAG_WINDOW_UNFOCUSED)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED)
|
set_window_state(pyray.FLAG_WINDOW_UNFOCUSED)
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_T):
|
if is_key_pressed(pyray.KEY_T):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_TOPMOST):
|
if is_window_state(pyray.FLAG_WINDOW_TOPMOST):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_TOPMOST)
|
clear_window_state(pyray.FLAG_WINDOW_TOPMOST)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_TOPMOST)
|
set_window_state(pyray.FLAG_WINDOW_TOPMOST)
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_A):
|
if is_key_pressed(pyray.KEY_A):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN):
|
if is_window_state(pyray.FLAG_WINDOW_ALWAYS_RUN):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN)
|
clear_window_state(pyray.FLAG_WINDOW_ALWAYS_RUN)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN)
|
set_window_state(pyray.FLAG_WINDOW_ALWAYS_RUN)
|
||||||
|
|
||||||
if is_key_pressed(pyray.KeyboardKey.KEY_V):
|
if is_key_pressed(pyray.KEY_V):
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT):
|
if is_window_state(pyray.FLAG_VSYNC_HINT):
|
||||||
clear_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT)
|
clear_window_state(pyray.FLAG_VSYNC_HINT)
|
||||||
else:
|
else:
|
||||||
set_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT)
|
set_window_state(pyray.FLAG_VSYNC_HINT)
|
||||||
|
|
||||||
# Bouncing ball logic
|
# Bouncing ball logic
|
||||||
ball_position.x += ball_speed.x
|
ball_position.x += ball_speed.x
|
||||||
|
@ -96,7 +96,7 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
begin_drawing()
|
begin_drawing()
|
||||||
|
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_TRANSPARENT):
|
if is_window_state(pyray.FLAG_WINDOW_TRANSPARENT):
|
||||||
clear_background(BLANK)
|
clear_background(BLANK)
|
||||||
else:
|
else:
|
||||||
clear_background(RAYWHITE)
|
clear_background(RAYWHITE)
|
||||||
|
@ -113,16 +113,16 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
# Draw window state info
|
# Draw window state info
|
||||||
draw_text("Following flags can be set after window creation:", 10, 60, 10, GRAY)
|
draw_text("Following flags can be set after window creation:", 10, 60, 10, GRAY)
|
||||||
flag_texts = [
|
flag_texts = [
|
||||||
("FLAG_FULLSCREEN_MODE", pyray.ConfigFlags.FLAG_FULLSCREEN_MODE),
|
("FLAG_FULLSCREEN_MODE", pyray.FLAG_FULLSCREEN_MODE),
|
||||||
("FLAG_WINDOW_RESIZABLE", pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE),
|
("FLAG_WINDOW_RESIZABLE", pyray.FLAG_WINDOW_RESIZABLE),
|
||||||
("FLAG_WINDOW_UNDECORATED", pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED),
|
("FLAG_WINDOW_UNDECORATED", pyray.FLAG_WINDOW_UNDECORATED),
|
||||||
("FLAG_WINDOW_HIDDEN", pyray.ConfigFlags.FLAG_WINDOW_HIDDEN),
|
("FLAG_WINDOW_HIDDEN", pyray.FLAG_WINDOW_HIDDEN),
|
||||||
("FLAG_WINDOW_MINIMIZED", pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED),
|
("FLAG_WINDOW_MINIMIZED", pyray.FLAG_WINDOW_MINIMIZED),
|
||||||
("FLAG_WINDOW_MAXIMIZED", pyray.ConfigFlags.FLAG_WINDOW_MAXIMIZED),
|
("FLAG_WINDOW_MAXIMIZED", pyray.FLAG_WINDOW_MAXIMIZED),
|
||||||
("FLAG_WINDOW_UNFOCUSED", pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED),
|
("FLAG_WINDOW_UNFOCUSED", pyray.FLAG_WINDOW_UNFOCUSED),
|
||||||
("FLAG_WINDOW_TOPMOST", pyray.ConfigFlags.FLAG_WINDOW_TOPMOST),
|
("FLAG_WINDOW_TOPMOST", pyray.FLAG_WINDOW_TOPMOST),
|
||||||
("FLAG_WINDOW_ALWAYS_RUN", pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN),
|
("FLAG_WINDOW_ALWAYS_RUN", pyray.FLAG_WINDOW_ALWAYS_RUN),
|
||||||
("FLAG_VSYNC_HINT", pyray.ConfigFlags.FLAG_VSYNC_HINT),
|
("FLAG_VSYNC_HINT", pyray.FLAG_VSYNC_HINT),
|
||||||
]
|
]
|
||||||
y_offset = 80
|
y_offset = 80
|
||||||
for text, flag in flag_texts:
|
for text, flag in flag_texts:
|
||||||
|
@ -133,15 +133,15 @@ while not window_should_close(): # Detect window close button or ESC key
|
||||||
y_offset += 20
|
y_offset += 20
|
||||||
|
|
||||||
draw_text("Following flags can only be set before window creation:", 10, 300, 10, GRAY)
|
draw_text("Following flags can only be set before window creation:", 10, 300, 10, GRAY)
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIGHDPI):
|
if is_window_state(pyray.FLAG_WINDOW_HIGHDPI):
|
||||||
draw_text("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, LIME)
|
draw_text("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, LIME)
|
||||||
else:
|
else:
|
||||||
draw_text("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, MAROON)
|
draw_text("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, MAROON)
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_TRANSPARENT):
|
if is_window_state(pyray.FLAG_WINDOW_TRANSPARENT):
|
||||||
draw_text("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, LIME)
|
draw_text("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, LIME)
|
||||||
else:
|
else:
|
||||||
draw_text("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, MAROON)
|
draw_text("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, MAROON)
|
||||||
if is_window_state(pyray.ConfigFlags.FLAG_MSAA_4X_HINT):
|
if is_window_state(pyray.FLAG_MSAA_4X_HINT):
|
||||||
draw_text("FLAG_MSAA_4X_HINT: on", 10, 360, 10, LIME)
|
draw_text("FLAG_MSAA_4X_HINT: on", 10, 360, 10, LIME)
|
||||||
else:
|
else:
|
||||||
draw_text("FLAG_MSAA_4X_HINT: off", 10, 360, 10, MAROON)
|
draw_text("FLAG_MSAA_4X_HINT: off", 10, 360, 10, MAROON)
|
||||||
|
|
|
@ -12,7 +12,7 @@ SCREEN_HEIGHT = 450
|
||||||
|
|
||||||
init_window(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [core] example - window should close")
|
init_window(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib [core] example - window should close")
|
||||||
|
|
||||||
set_exit_key(KeyboardKey.KEY_NULL) # Disable KEY_ESCAPE to close window, X-button still works
|
set_exit_key(KEY_NULL) # Disable KEY_ESCAPE to close window, X-button still works
|
||||||
|
|
||||||
exitWindowRequested = False # Flag to request window to exit
|
exitWindowRequested = False # Flag to request window to exit
|
||||||
exitWindow = False # Flag to set window to exit
|
exitWindow = False # Flag to set window to exit
|
||||||
|
@ -26,7 +26,7 @@ while not exitWindow:
|
||||||
# Update
|
# Update
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
# Detect if X-button or KEY_ESCAPE have been pressed to close window
|
# Detect if X-button or KEY_ESCAPE have been pressed to close window
|
||||||
if window_should_close() or is_key_pressed(KeyboardKey.KEY_ESCAPE):
|
if window_should_close() or is_key_pressed(KEY_ESCAPE):
|
||||||
exitWindowRequested = True
|
exitWindowRequested = True
|
||||||
|
|
||||||
if exitWindowRequested:
|
if exitWindowRequested:
|
||||||
|
@ -34,9 +34,9 @@ while not exitWindow:
|
||||||
# A request for close window has been issued, we can save data before closing
|
# A request for close window has been issued, we can save data before closing
|
||||||
# or just show a message asking for confirmation
|
# or just show a message asking for confirmation
|
||||||
|
|
||||||
if is_key_pressed(KeyboardKey.KEY_Y):
|
if is_key_pressed(KEY_Y):
|
||||||
exitWindow = True
|
exitWindow = True
|
||||||
elif is_key_pressed(KeyboardKey.KEY_N):
|
elif is_key_pressed(KEY_N):
|
||||||
exitWindowRequested = False
|
exitWindowRequested = False
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue