Compare commits
No commits in common. "master" and "v5.0.0.4" have entirely different histories.
148 changed files with 18675 additions and 27954 deletions
108
.cirrus.yml
108
.cirrus.yml
|
@ -4,45 +4,21 @@
|
|||
pi_task:
|
||||
arm_container:
|
||||
matrix:
|
||||
- image: dtcooper/raspberrypi-os:python3.12-bullseye
|
||||
- image: dtcooper/raspberrypi-os:python-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 ..
|
||||
- apt -y install cmake libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev
|
||||
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 ..
|
||||
- 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 -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/
|
||||
|
@ -52,18 +28,6 @@ pi_task:
|
|||
- 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/*"
|
||||
|
||||
|
@ -72,52 +36,14 @@ mac_task:
|
|||
matrix:
|
||||
- image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
|
||||
env:
|
||||
MACOSX_DEPLOYMENT_TARGET: "11.0"
|
||||
matrix:
|
||||
- env:
|
||||
PY_VER: "3.9"
|
||||
RAYLIB_PLATFORM: Desktop
|
||||
- env:
|
||||
PY_VER: "3.9"
|
||||
RAYLIB_PLATFORM: SDL
|
||||
- env:
|
||||
PY_VER: "3.10"
|
||||
RAYLIB_PLATFORM: Desktop
|
||||
- env:
|
||||
PY_VER: "3.10"
|
||||
RAYLIB_PLATFORM: SDL
|
||||
- env:
|
||||
PY_VER: "3.11"
|
||||
RAYLIB_PLATFORM: Desktop
|
||||
- env:
|
||||
PY_VER: "3.11"
|
||||
RAYLIB_PLATFORM: SDL
|
||||
- env:
|
||||
PY_VER: "3.12"
|
||||
RAYLIB_PLATFORM: Desktop
|
||||
- env:
|
||||
PY_VER: "3.12"
|
||||
RAYLIB_PLATFORM: SDL
|
||||
- env:
|
||||
PY_VER: "3.13"
|
||||
RAYLIB_PLATFORM: Desktop
|
||||
- env:
|
||||
PY_VER: "3.13"
|
||||
RAYLIB_PLATFORM: SDL
|
||||
|
||||
|
||||
- PY_VER: "3.9"
|
||||
- PY_VER: "3.10"
|
||||
- PY_VER: "3.11"
|
||||
- PY_VER: "3.12"
|
||||
setup_script:
|
||||
- brew update
|
||||
- brew install python@${PY_VER}
|
||||
build_sdl_script:
|
||||
- wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
|
||||
- tar xvfz release-2.30.7.tar.gz
|
||||
- mkdir buildsdl
|
||||
- cd buildsdl
|
||||
- cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
|
||||
- cmake --build . --config Release
|
||||
- sudo cmake --install .
|
||||
- cd ..
|
||||
build_raylib_script:
|
||||
- git submodule update --init --recursive
|
||||
- cd raylib-c
|
||||
|
@ -126,32 +52,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 ..
|
||||
- make -j8
|
||||
- sudo make install
|
||||
build_raylib_again_script:
|
||||
- cd raylib-c
|
||||
- mkdir build2
|
||||
- cd build2
|
||||
- cmake -DPLATFORM=${RAYLIB_PLATFORM} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||
- make -j8
|
||||
- sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
|
||||
build_script:
|
||||
- sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
||||
- sudo cp physac/src/physac.h /usr/local/include/
|
||||
- sudo cp raygui/src/raygui.h /usr/local/include/
|
||||
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages --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 setuptools
|
||||
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages wheel
|
||||
- /opt/homebrew/bin/python${PY_VER} setup.py bdist_wheel
|
||||
test_script:
|
||||
- /opt/homebrew/bin/python${PY_VER} -m pip install --break-system-packages dist/*.whl
|
||||
- cd /
|
||||
- /opt/homebrew/bin/python${PY_VER} -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
|
||||
- cat /tmp/output
|
||||
- if grep -q "INFO: Initializing raylib" /tmp/output; then
|
||||
- echo "Passed"
|
||||
- exit 0
|
||||
- else
|
||||
- echo "Failed"
|
||||
- exit 1
|
||||
- fi
|
||||
artifacts:
|
||||
path: "dist/*"
|
333
.github/workflows/build.yml
vendored
333
.github/workflows/build.yml
vendored
|
@ -4,39 +4,28 @@ name: Build
|
|||
on:
|
||||
# Triggers the workflow on push or pull request events but only for the master branch
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
jobs:
|
||||
build-mac-intel:
|
||||
runs-on: macos-13
|
||||
build-mac:
|
||||
runs-on: macos-12
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ]
|
||||
raylib-platform: ['Desktop', 'SDL']
|
||||
env:
|
||||
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
||||
python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13.0-beta - 3.13.0', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Build SDL
|
||||
run: |
|
||||
wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
|
||||
tar xvfz release-2.30.7.tar.gz
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ../SDL-release-2.30.7 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build . --config Release
|
||||
sudo cmake --install .
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
@ -44,7 +33,7 @@ jobs:
|
|||
architecture: x64
|
||||
|
||||
# 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: |
|
||||
cd raylib-c
|
||||
mkdir build
|
||||
|
@ -53,15 +42,6 @@ jobs:
|
|||
make -j2
|
||||
sudo make install
|
||||
|
||||
- name: Build raylib with SDL if selected
|
||||
run: |
|
||||
cd raylib-c
|
||||
mkdir build2
|
||||
cd build2
|
||||
cmake -DPLATFORM=${{ matrix.raylib-platform }} -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||
make -j2
|
||||
sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
|
||||
|
||||
- name: Copy extras
|
||||
run: |
|
||||
sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
||||
|
@ -69,105 +49,50 @@ jobs:
|
|||
sudo cp raygui/src/raygui.h /usr/local/include/
|
||||
|
||||
- name: Build raylib-python-cffi
|
||||
env:
|
||||
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip3 install "cffi>=1.17.1"
|
||||
pip3 install wheel
|
||||
pip3 install setuptools
|
||||
python setup.py bdist_wheel --plat-name macosx_10_13_x86_64
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
pip3 install dist/*.whl
|
||||
cd /
|
||||
python3 -c 'import pyray; pyray.init_window(100,100,"test")' >/tmp/output 2>&1 || true
|
||||
cat /tmp/output
|
||||
if grep -q "INFO: Initializing raylib" /tmp/output; then
|
||||
echo "Passed"
|
||||
exit 0
|
||||
else
|
||||
echo "Failed"
|
||||
exit 1
|
||||
fi
|
||||
python setup.py bdist_wheel --plat-name macosx_10_15_x86_64
|
||||
|
||||
- name: Upload build Artifact wheel
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3.2.1
|
||||
with:
|
||||
name: wheel-mac-${{ matrix.raylib-platform }}-${{ matrix.python-version }}
|
||||
name: wheel
|
||||
path: dist/*
|
||||
|
||||
# build-mac-universal:
|
||||
# runs-on: macos-14
|
||||
|
||||
# build-mac12-arm64:
|
||||
# runs-on: macos-12
|
||||
# strategy:
|
||||
# matrix:
|
||||
# python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||
# raylib-platform: ['Desktop', 'SDL']
|
||||
# env:
|
||||
# MACOSX_DEPLOYMENT_TARGET: 11.0
|
||||
# python-version: ['3.10', '3.11.0-alpha - 3.11.0' ]
|
||||
# # Requires universal2 build of python, which we get if we ask for 3.10.5 x86! Pypy not available in universal2
|
||||
# steps:
|
||||
# # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
# - uses: actions/checkout@v4
|
||||
# - uses: actions/checkout@v2
|
||||
# with:
|
||||
# submodules: recursive
|
||||
#
|
||||
# - name: Build SDL
|
||||
# run: |
|
||||
# wget https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.7.tar.gz
|
||||
# tar xvfz release-2.30.7.tar.gz
|
||||
# mkdir build
|
||||
# cd build
|
||||
# cmake ../SDL-release-2.30.7 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
|
||||
# cmake --build . --config Release
|
||||
# sudo cmake --install .
|
||||
#
|
||||
# - name: Setup Python
|
||||
# uses: actions/setup-python@v5
|
||||
# uses: actions/setup-python@v2.2.2
|
||||
# with:
|
||||
# # Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
# python-version: ${{ matrix.python-version }}
|
||||
# architecture: arm64
|
||||
# architecture: x64
|
||||
#
|
||||
# # Runs a set of commands using the runners shell
|
||||
# - name: Build raylib without SDL because SDL version has incorrect pkg-config
|
||||
# # Only build raylib for arm64 (although we could make a fat universal2 binary by asking for x86_64 as well)
|
||||
# - name: Build raylib
|
||||
# run: |
|
||||
# cd raylib-c
|
||||
# mkdir build
|
||||
# cd build
|
||||
# cmake -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||
# 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: Build raylib with SDL if selected
|
||||
# run: |
|
||||
# cd raylib-c
|
||||
# mkdir build2
|
||||
# cd build2
|
||||
# cmake -DPLATFORM=${{ matrix.raylib-platform }} -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DPLATFORM=SDL -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||
# make -j2
|
||||
# sudo cp raylib/libraylib.a /usr/local/lib/libraylib.a
|
||||
#
|
||||
# - name: Copy extras
|
||||
# run: |
|
||||
# sudo cp -r raylib-c/src/external/glfw/include/GLFW /usr/local/include/
|
||||
# sudo cp physac/src/physac.h /usr/local/include/
|
||||
# sudo cp raygui/src/raygui.h /usr/local/include/
|
||||
#
|
||||
# - name: Build raylib-python-cffi
|
||||
# run: |
|
||||
# python -m pip install --upgrade pip
|
||||
# pip3 install "cffi>=1.17.1"
|
||||
# pip3 install wheel
|
||||
# pip3 install setuptools
|
||||
# RAYLIB_PLATFORM=${{ matrix.raylib-platform }} python setup.py bdist_wheel
|
||||
#
|
||||
# - name: Upload build Artifact wheel
|
||||
# uses: actions/upload-artifact@v3.2.1
|
||||
# with:
|
||||
# name: wheel
|
||||
# path: dist/*
|
||||
|
||||
#
|
||||
# # Name defaults to universal2 and it technically is, but we override name to arm64. Why don't we make a working universal2 wheel? Because
|
||||
# # I'd rather have a separate x86_64 that I can test, and I want it to work on 10_15 but I'm not sure a 'macosx_10_15_universal2' is valid
|
||||
|
@ -178,52 +103,94 @@ jobs:
|
|||
# pip3 install cffi
|
||||
# pip3 install wheel
|
||||
# python setup.py bdist_wheel --plat-name macosx_12_0_arm64
|
||||
|
||||
#
|
||||
#
|
||||
# - name: Upload build Artifact wheel
|
||||
# uses: actions/upload-artifact@v3.2.1
|
||||
# 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@v3.2.1
|
||||
# with:
|
||||
# name: wheel
|
||||
# path: dist/*
|
||||
#
|
||||
|
||||
|
||||
build-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
# You can use PyPy versions in python-version.
|
||||
# For example, pypy2 and pypy3
|
||||
matrix:
|
||||
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ]
|
||||
raylib-platform: ['Desktop', 'SDL', 'DRM']
|
||||
python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13.0-beta - 3.13.0', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
python-version: ${{ matrix.python-version }}
|
||||
# The target architecture (x86, x64) of the Python interpreter.
|
||||
architecture: x64
|
||||
|
||||
- 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
|
||||
- name: Build raylib
|
||||
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
|
||||
mkdir 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
|
||||
sudo make install
|
||||
- name: Copy extras
|
||||
|
@ -232,37 +199,50 @@ jobs:
|
|||
sudo cp physac/src/physac.h /usr/local/include/
|
||||
sudo cp raygui/src/raygui.h /usr/local/include/
|
||||
- name: Build raylib-python-cffi
|
||||
env:
|
||||
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip3 install "cffi>=1.17.1"
|
||||
pip3 install wheel
|
||||
pip3 install setuptools
|
||||
python setup.py bdist_wheel --plat-name 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
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3.2.1
|
||||
with:
|
||||
name: wheel-linux-${{ matrix.raylib-platform }}-${{ matrix.python-version }}
|
||||
name: wheel
|
||||
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@v3.2.1
|
||||
# with:
|
||||
# name: wheel
|
||||
# path: dist/*
|
||||
|
||||
build-windows:
|
||||
# The type of runner that the job will run on
|
||||
|
@ -271,27 +251,15 @@ jobs:
|
|||
# You can use PyPy versions in python-version.
|
||||
# For example, pypy2 and pypy3
|
||||
matrix:
|
||||
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.9', 'pypy-3.10', 'pypy-3.11' ]
|
||||
raylib-platform: ['Desktop', 'SDL']
|
||||
python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13.0-beta - 3.13.0', 'pypy-3.8', 'pypy-3.9', 'pypy-3.10' ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
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
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
@ -299,25 +267,21 @@ jobs:
|
|||
architecture: x64
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
|
||||
- name: Build raylib
|
||||
run: |
|
||||
cd raylib-c
|
||||
mkdir 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
|
||||
copy raylib\Release\raylib.lib ..\..
|
||||
cd ..\..
|
||||
shell: cmd
|
||||
|
||||
- name: Build raylib-python-cffi
|
||||
env:
|
||||
RAYLIB_PLATFORM: ${{ matrix.raylib-platform }}
|
||||
run: |
|
||||
copy ${{ runner.temp }}\SDL2\lib\x64\SDL2.lib .
|
||||
copy ${{ runner.temp }}\SDL2\lib\x64\SDL2.dll raylib\
|
||||
python -m pip install --upgrade pip
|
||||
pip3 install "cffi>=1.17.1"
|
||||
pip3 install wheel
|
||||
|
@ -329,38 +293,23 @@ jobs:
|
|||
python setup.py bdist_wheel
|
||||
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
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3.2.1
|
||||
with:
|
||||
name: wheel-windows-${{ matrix.raylib-platform }}-${{ matrix.python-version }}
|
||||
name: wheel
|
||||
path: dist/*
|
||||
|
||||
source-distro:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
python-version: '3.12'
|
||||
|
@ -370,7 +319,7 @@ jobs:
|
|||
- name: Build raylib
|
||||
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
|
||||
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
|
||||
mkdir build
|
||||
cd build
|
||||
|
@ -392,22 +341,22 @@ jobs:
|
|||
python setup.py sdist
|
||||
|
||||
- name: Upload build Artifact wheel
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3.2.1
|
||||
with:
|
||||
name: wheel-source
|
||||
name: wheel
|
||||
path: dist/*
|
||||
|
||||
dynamic-distro:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
# Version range or exact version of a Python version to use, using SemVer's version range syntax.
|
||||
python-version: '3.12'
|
||||
|
@ -424,17 +373,7 @@ jobs:
|
|||
python setup.py sdist
|
||||
|
||||
- name: Upload build Artifact wheel
|
||||
uses: actions/upload-artifact@v4
|
||||
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
|
||||
uses: actions/upload-artifact@v3.2.1
|
||||
with:
|
||||
name: wheel
|
||||
pattern: wheel-*
|
||||
path: dynamic/dist/*
|
||||
|
|
4
.gitmodules
vendored
4
.gitmodules
vendored
|
@ -1,9 +1,9 @@
|
|||
[submodule "raylib-c"]
|
||||
path = raylib-c
|
||||
url = https://git.terah.dev/UnrealXR/raylib.git
|
||||
url = https://github.com/raysan5/raylib.git
|
||||
[submodule "raygui"]
|
||||
path = raygui
|
||||
url = https://github.com/raysan5/raygui.git
|
||||
[submodule "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
|
||||
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
|
||||
|
||||
Windows manual build
|
||||
|
@ -83,6 +83,11 @@ To build a binary wheel distribution:
|
|||
pip3 install 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:
|
||||
|
||||
::
|
||||
|
|
|
@ -2,7 +2,6 @@ include raylib/*.so
|
|||
include raylib/*.pyi
|
||||
include pyray/*.pyi
|
||||
include raylib/*.pyd
|
||||
include raylib/*.dll
|
||||
exclude raylib/*.a
|
||||
include raylib/*.h
|
||||
include raylib/*.h.modified
|
||||
|
@ -10,7 +9,6 @@ exclude raylib/*.c
|
|||
exclude raylib/*.o
|
||||
include version.py
|
||||
exclude tests/*
|
||||
include raylib/py.typed
|
||||
include pyray/py.typed
|
||||
|
||||
|
||||
|
||||
|
|
165
README.md
165
README.md
|
@ -1,195 +1,124 @@
|
|||
# Python Bindings for Raylib 5.5
|
||||
## Libraries: raymath, raygui, rlgl, physac and GLFW
|
||||
## Backends: Desktop, SDL, DRM, Web
|
||||
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
|
||||
# Python Bindings for Raylib 5.0
|
||||
|
||||

|
||||
Chatroom: [Discord](https://discord.gg/fKDwt85aX6) or [Matrix](https://matrix.to/#/#raylib-python-cffi:matrix.org)
|
||||
|
||||
Chatroom: [Discord](https://discord.gg/fKDwt85aX6)
|
||||
|
||||
HELP WANTED: [writing examples](https://github.com/electronstudio/raylib-python-cffi/issues/155)
|
||||
|
||||
Features:
|
||||
|
||||
* CFFI API static bindings.
|
||||
New CFFI API static bindings.
|
||||
* Automatically generated to be as close as possible to
|
||||
original Raylib.
|
||||
* Faster, fewer bugs and easier to maintain than ctypes.
|
||||
* Commercial-friendly license.
|
||||
* 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)
|
||||
|
||||
# Quickstart
|
||||
|
||||
`pip3 install raylib==5.5.0.2 --break-system-packages`
|
||||
```python
|
||||
from pyray import *
|
||||
init_window(800, 450, "Hello")
|
||||
while not window_should_close():
|
||||
`pip3 install raylib`
|
||||
|
||||
from pyray import *
|
||||
init_window(800, 450, "Hello")
|
||||
while not window_should_close():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
end_drawing()
|
||||
close_window()
|
||||
```
|
||||
close_window()
|
||||
|
||||
|
||||
# Installation
|
||||
|
||||
If you are on a modern Linux you will probably want to create a venv:
|
||||
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
|
||||
Then make sure you have the latest pip installed:
|
||||
First make sure you have the latest pip installed:
|
||||
|
||||
python3 -m pip install --upgrade pip
|
||||
|
||||
Then install
|
||||
|
||||
python3 -m pip install setuptools
|
||||
python3 -m pip install raylib==5.5.0.2
|
||||
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
|
||||
source, in which case you will need to have Raylib development libs installed, e.g.
|
||||
On most platforms it should install a binary wheel (Windows 10 x64, MacOS 12 x64/arm64, Linux Ubuntu2004 x64/arm64).
|
||||
|
||||
If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g.
|
||||
using homebrew, apt, etc.
|
||||
|
||||
## Windows
|
||||
|
||||
Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)
|
||||
|
||||
Use an [official Windows Python release](https://www.python.org/downloads/windows/) rather than WSL, MSYS, etc.
|
||||
|
||||
## MacOS
|
||||
|
||||
Binaries require:
|
||||
* arm64 MacOS 14
|
||||
* x64 MacOS 10.13, or newer.
|
||||
|
||||
Older MacOS requires building from source but this is usually simple:
|
||||
|
||||
brew install pkg-config
|
||||
brew install raylib
|
||||
python3 -m pip install raylib==5.5.0.2
|
||||
|
||||
(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue
|
||||
if you want to test them.)
|
||||
|
||||
## Linux
|
||||
|
||||
Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source.
|
||||
(Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)
|
||||
|
||||
The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0
|
||||
so may not work on other boards.
|
||||
|
||||
## Raspberry Pi
|
||||
|
||||
[Using on Rasperry Pi](RPI.rst)
|
||||
|
||||
# Backends
|
||||
|
||||
## Dynamic binding version
|
||||
|
||||
There is now a separate dynamic version of this binding:
|
||||
|
||||
python3 -m pip uninstall raylib
|
||||
python3 -m pip install raylib_dynamic
|
||||
|
||||
It works on some systems where the static version doesn't, [but be sure to read these caveats before using it](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
|
||||
|
||||
You can't have multiple raylib packages installed at once.
|
||||
## 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 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.
|
||||
python3 -m pip install raylib==4.2.0.0.dev4
|
||||
|
||||
## Problems?
|
||||
|
||||
If it doesn't work, [try to build manually.](BUILDING.rst). If that works then [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues)
|
||||
to let us know what you did.
|
||||
|
||||
If you need help you can try asking on [our discord](https://discord.gg/fKDwt85aX6). There is also a large [Raylib discord](https://discord.gg/raylib)
|
||||
for issues that are not Python-specific.
|
||||
If you need help you can try asking [on Discord](https://discord.gg/raylib).
|
||||
|
||||
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
|
||||
|
||||
|
||||
# How to use
|
||||
|
||||
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
|
||||
pyray. Do *not* `pip install pyray`). You can use either or both:
|
||||
There are two APIs, you can use either or both:
|
||||
|
||||
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
|
||||
|
||||
Use [the 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
|
||||
|
||||
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser. Usually the latest git version
|
||||
is recommended.
|
||||
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser.
|
||||
|
||||
Make a folder `my_project` with a file `main.py`:
|
||||
|
||||
```python
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "cffi",
|
||||
# "raylib"
|
||||
# ]
|
||||
# ///
|
||||
import asyncio
|
||||
import platform
|
||||
from pyray import *
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "cffi",
|
||||
# "raylib"
|
||||
# ]
|
||||
# ///
|
||||
import asyncio
|
||||
import platform
|
||||
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")
|
||||
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():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
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()
|
||||
|
||||
asyncio.run(main())
|
||||
```
|
||||
asyncio.run(main())
|
||||
|
||||
Then to create the web files and launch a web server:
|
||||
|
||||
python3.12 -m pip install --user --upgrade pygbag
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||
|
||||
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.
|
||||
Carefully read all their [documentation](https://pygame-web.github.io/).
|
||||
|
||||
|
@ -197,20 +126,10 @@ It does work for most of [these examples](https://electronstudio.github.io/rayli
|
|||
|
||||
# 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)
|
||||
|
||||
[Alloy Bloxel Editor](https://pebaz.itch.io/alloy-bloxel-editor)
|
||||
|
||||
[Eidolon](https://github.com/Miou-zora/Eidolon)
|
||||
|
||||
Add your app here!
|
||||
|
||||
# RLZero
|
||||
|
@ -224,9 +143,9 @@ A related library (that is a work in progress!):
|
|||
* Converting more examples from C to Python
|
||||
* 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!
|
||||
|
||||
# Performance
|
||||
|
|
9
RPI.rst
9
RPI.rst
|
@ -12,10 +12,7 @@ We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11
|
|||
|
||||
python -m pip install --break-system-packages raylib
|
||||
|
||||
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
|
||||
installed at once.
|
||||
|
||||
If it doesn't work, or you're not on Bullseye, or you're 32 bit, you will need to compile your own raylib. See below.
|
||||
If it doesn't work, or you're not on Bullseye, or you're 32 bit, or if you want to use Raylib in ``PLATFORM_DRM`` mode, you will need to compile your own raylib. See below.
|
||||
For full instructions on this, see https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi . If you need help with this ask Raylib.
|
||||
|
||||
Option 2: Compile Raylib from source X11 mode
|
||||
|
@ -42,7 +39,7 @@ Then have pip compile and install the wheel:
|
|||
::
|
||||
|
||||
python3 -m pip install --break-system-packages setuptools
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.0.0.3
|
||||
|
||||
Option 3: Compile Raylib from source DRM mode
|
||||
---------------------------------------------
|
||||
|
@ -85,7 +82,7 @@ Then have pip compile and install the wheel:
|
|||
::
|
||||
|
||||
python3 -m pip install --break-system-packages setuptools
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.0.0.3
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@ def process(filename):
|
|||
for e in js['enums']:
|
||||
if e['name'] and e['values']:
|
||||
print ("class "+e['name']+"("+"IntEnum):")
|
||||
print(f' """{e['description']}."""')
|
||||
for value in e['values']:
|
||||
print(" "+value['name']+" = "+str(value['value']))
|
||||
print("")
|
||||
|
@ -35,4 +34,3 @@ print("""from enum import IntEnum
|
|||
process("raylib.json")
|
||||
process("raygui.json")
|
||||
process("glfw3.json")
|
||||
process("physac.json")
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
|
||||
from pathlib import Path
|
||||
from raylib import rl, ffi
|
||||
from pyray import _underscore
|
||||
from inspect import ismethod, getmembers, isbuiltin
|
||||
import inflection, sys, json
|
||||
|
||||
|
@ -30,13 +29,6 @@ for filename in (Path("raylib.json"), Path("raymath.json"), Path("rlgl.json"), P
|
|||
for st in js["structs"]:
|
||||
if st["name"] not in known_structs:
|
||||
known_structs[st["name"]] = st
|
||||
for e in js['enums']:
|
||||
if e['name'] and e['values']:
|
||||
print("class "+e['name']+"(int):")
|
||||
print(f' """{e['description']}."""')
|
||||
for value in e['values']:
|
||||
print(" "+value['name']+" = "+str(value['value']))
|
||||
print("")
|
||||
|
||||
|
||||
def ctype_to_python_type(t):
|
||||
|
@ -50,47 +42,36 @@ def ctype_to_python_type(t):
|
|||
return "int"
|
||||
elif t == "uint64_t":
|
||||
return "int"
|
||||
elif t == "short":
|
||||
return "int"
|
||||
elif t == "unsigned short":
|
||||
return "int"
|
||||
elif t == "double":
|
||||
return "float"
|
||||
elif "char * *" in t:
|
||||
return "list[str]"
|
||||
elif "char *" in t:
|
||||
return "str"
|
||||
elif t == "char":
|
||||
elif "char" in t:
|
||||
return "str" # not sure about this one
|
||||
elif t == "unsigned char":
|
||||
return "int"
|
||||
elif "*" in t:
|
||||
return "Any"
|
||||
elif "[" in t:
|
||||
return "list" # TODO FIXME type of items in the list
|
||||
elif t.startswith("struct"):
|
||||
return t.replace("struct ", "")
|
||||
elif t.startswith("unsigned"):
|
||||
return t.replace("unsigned ", "")
|
||||
elif t.startswith("enum"):
|
||||
return t.replace("enum ", "")
|
||||
else:
|
||||
return t
|
||||
|
||||
|
||||
print("""from typing import Any
|
||||
from warnings import deprecated
|
||||
import _cffi_backend # type: ignore
|
||||
|
||||
ffi: _cffi_backend.FFI
|
||||
PhysicsShapeType = int
|
||||
|
||||
def pointer(struct):
|
||||
...
|
||||
""")
|
||||
|
||||
# These words can be used for c arg names, but not in python
|
||||
reserved_words = ("in", "list", "tuple", "set", "dict", "from", "range", "min", "max", "any", "all", "len")
|
||||
|
||||
for name, attr in getmembers(rl):
|
||||
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'>":
|
||||
json_object = known_functions.get(name, None)
|
||||
if json_object is None:
|
||||
|
@ -109,8 +90,6 @@ for name, attr in getmembers(rl):
|
|||
if param_name in reserved_words:
|
||||
param_name = param_name + "_" + str(i)
|
||||
param_type = ctype_to_python_type(arg.cname)
|
||||
if "struct" in arg.cname:
|
||||
param_type += "|list|tuple"
|
||||
sig += f"{param_name}: {param_type},"
|
||||
|
||||
return_type = ffi.typeof(attr).result.cname
|
||||
|
@ -120,11 +99,8 @@ for name, attr in getmembers(rl):
|
|||
if 'description' in json_object:
|
||||
description = json_object['description']
|
||||
|
||||
if 'physics' in uname:
|
||||
print('@deprecated("Raylib no longer recommends the use of Physac library")')
|
||||
print(f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:')
|
||||
print(f' """{description}."""')
|
||||
print(f' ...')
|
||||
print(
|
||||
f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:\n """{description}"""\n ...')
|
||||
|
||||
elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>":
|
||||
return_type = ffi.typeof(attr).result.cname
|
||||
|
@ -149,22 +125,19 @@ for struct in ffi.list_types()[0]:
|
|||
print("weird empty struct, skipping " + struct, file=sys.stderr)
|
||||
continue
|
||||
print(f"class {struct}:")
|
||||
print(f' """{known_structs[struct]['description']}."""')
|
||||
print(f' """ struct """')
|
||||
sig = ""
|
||||
for arg in ffi.typeof(struct).fields:
|
||||
ptype = ctype_to_python_type(arg[1].type.cname)
|
||||
if arg[1].type.kind == "struct":
|
||||
ptype += "|list|tuple"
|
||||
sig += f", {arg[0]}: {ptype}|None = None"
|
||||
sig += ", " + arg[0]
|
||||
print(f" def __init__(self{sig}):")
|
||||
|
||||
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":
|
||||
# print(f"{struct}: int")
|
||||
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
|
||||
|
|
|
@ -42,39 +42,30 @@ def ctype_to_python_type(t):
|
|||
return "int"
|
||||
elif t == "uint64_t":
|
||||
return "int"
|
||||
elif t == "short":
|
||||
return "int"
|
||||
elif t == "unsigned short":
|
||||
return "int"
|
||||
elif t == "double":
|
||||
return "float"
|
||||
elif "char * *" in t:
|
||||
return "list[bytes]"
|
||||
return "list[str]"
|
||||
elif "char *" in t:
|
||||
return "bytes"
|
||||
return "str"
|
||||
elif "char" in t:
|
||||
return "bytes" # not sure about this one
|
||||
return "str" # not sure about this one
|
||||
elif "*" in t:
|
||||
return "Any"
|
||||
elif "[" in t:
|
||||
return "list" # TODO FIXME type of items in the list
|
||||
elif t.startswith("struct"):
|
||||
return t.replace("struct ", "")
|
||||
elif t.startswith("unsigned"):
|
||||
return t.replace("unsigned ", "")
|
||||
elif t.startswith("enum"):
|
||||
return t.replace("enum ", "")
|
||||
else:
|
||||
return t
|
||||
|
||||
|
||||
print("""from typing import Any
|
||||
from warnings import deprecated
|
||||
import _cffi_backend # type: ignore
|
||||
|
||||
import _cffi_backend
|
||||
|
||||
ffi: _cffi_backend.FFI
|
||||
rl: _cffi_backend.Lib
|
||||
PhysicsShapeType = int
|
||||
|
||||
class struct: ...
|
||||
|
||||
|
@ -105,8 +96,6 @@ for name, attr in getmembers(rl):
|
|||
if param_name in reserved_words:
|
||||
param_name = param_name + "_" + str(i)
|
||||
param_type = ctype_to_python_type(arg.cname)
|
||||
if "struct" in arg.cname:
|
||||
param_type += "|list|tuple"
|
||||
sig += f"{param_name}: {param_type},"
|
||||
|
||||
return_type = ffi.typeof(attr).result.cname
|
||||
|
@ -115,12 +104,8 @@ for name, attr in getmembers(rl):
|
|||
if 'description' in json_object:
|
||||
description = json_object['description']
|
||||
|
||||
if 'Physics' in uname:
|
||||
print('@deprecated("Raylib no longer recommends the use of Physac library")')
|
||||
print(f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:')
|
||||
print(f' """{description}."""')
|
||||
print(f' ...')
|
||||
|
||||
print(
|
||||
f'def {uname}({sig}) -> {ctype_to_python_type(return_type)}:\n """{description}"""\n ...')
|
||||
|
||||
elif str(type(attr)) == "<class '_cffi_backend._CDataBase'>":
|
||||
return_type = ffi.typeof(attr).result.cname
|
||||
|
@ -136,24 +121,19 @@ for struct in ffi.list_types()[0]:
|
|||
# if ffi.typeof(struct).fields is None:
|
||||
# print("weird empty struct, skipping", file=sys.stderr)
|
||||
# continue
|
||||
print(f"class {struct}:")
|
||||
print(f"{struct}: struct")
|
||||
# sig = ""
|
||||
fields = ffi.typeof(struct).fields
|
||||
if fields is not None:
|
||||
#print(ffi.typeof(struct).fields)
|
||||
#print(f" {arg}: {arg}")
|
||||
# for arg in ffi.typeof(struct).fields:
|
||||
# sig += ", " + arg[0]
|
||||
# print(f" def __init__(self{sig}):")
|
||||
#
|
||||
for arg in ffi.typeof(struct).fields:
|
||||
print(f" {arg[0]}: {ctype_to_python_type(arg[1].type.cname)}")
|
||||
else:
|
||||
print(" ...")
|
||||
# for arg in ffi.typeof(struct).fields:
|
||||
# print(f" self.{arg[0]}={arg[0]}")
|
||||
|
||||
elif ffi.typeof(struct).kind == "enum":
|
||||
print(f"{struct} = int")
|
||||
print(f"{struct}: int")
|
||||
else:
|
||||
print("WARNING: SKIPPING UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr)
|
||||
print("ERROR UNKNOWN TYPE", ffi.typeof(struct), file=sys.stderr)
|
||||
|
||||
|
||||
print("""
|
||||
|
|
|
@ -56,6 +56,7 @@ Example program:
|
|||
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>`_
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 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.
|
||||
config: f2032a6434b52f7c68551d0ad70d555b
|
||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||
config: 614f580883a5bffb7f1606004f7be223
|
||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
|
@ -7,15 +5,19 @@
|
|||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
|
@ -45,16 +47,15 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul class="current">
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</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
|
||||
fixed it, a PR.)</p>
|
||||
</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>
|
||||
<section id="windows-manual-build">
|
||||
<h3>Windows manual build<a class="headerlink" href="#windows-manual-build" title="Link to this heading"></a></h3>
|
||||
|
|
226
docs/README.html
226
docs/README.html
|
@ -1,21 +1,23 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Python Bindings for Raylib 5.5 — Raylib Python documentation</title>
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<title>Python Bindings for Raylib 5.0 — Raylib Python documentation</title>
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
|
@ -45,37 +47,25 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul class="current">
|
||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Python Bindings for Raylib 5.5</a><ul>
|
||||
<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 current"><a class="current reference internal" href="#">Python Bindings for Raylib 5.0</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-l2"><a class="reference internal" href="#windows">Windows</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#macos">MacOS</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#linux">Linux</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#raspberry-pi">Raspberry Pi</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="#backends">Backends</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#dynamic-binding-version">Dynamic binding version</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#sdl-backend">SDL backend</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="#beta-testing">Beta testing</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#problems">Problems?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<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-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>
|
||||
</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="#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="#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-l2"><a class="reference internal" href="#bunnymark">Bunnymark</a></li>
|
||||
</ul>
|
||||
|
@ -103,7 +93,7 @@
|
|||
<div role="navigation" aria-label="Page navigation">
|
||||
<ul class="wy-breadcrumbs">
|
||||
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
|
||||
<li class="breadcrumb-item active">Python Bindings for Raylib 5.5</li>
|
||||
<li class="breadcrumb-item active">Python Bindings for Raylib 5.0</li>
|
||||
<li class="wy-breadcrumbs-aside">
|
||||
<a href="_sources/README.md.txt" rel="nofollow"> View page source</a>
|
||||
</li>
|
||||
|
@ -113,203 +103,131 @@
|
|||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||||
<div itemprop="articleBody">
|
||||
|
||||
<section id="python-bindings-for-raylib-5-5">
|
||||
<h1>Python Bindings for Raylib 5.5<a class="headerlink" href="#python-bindings-for-raylib-5-5" title="Link to this heading"></a></h1>
|
||||
<section id="libraries-raymath-raygui-rlgl-physac-and-glfw">
|
||||
<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>
|
||||
<section id="python-bindings-for-raylib-5-0">
|
||||
<h1>Python Bindings for Raylib 5.0<a class="headerlink" href="#python-bindings-for-raylib-5-0" title="Link to this heading"></a></h1>
|
||||
<iframe src="https://electronstudio.github.io/raylib-python-cffi-pygbag-examples/shapes_bouncing_ball/build/web/" style="border:0px #ffffff none;" name="myiFrame" scrolling="no" frameborder="1" marginheight="0px" marginwidth="0px" height="450px" width="800px" allowfullscreen></iframe>
|
||||
<p>Chatroom: <a class="reference external" href="https://discord.gg/fKDwt85aX6">Discord</a> or <a class="reference external" href="https://matrix.to/#/#raylib-python-cffi:matrix.org">Matrix</a></p>
|
||||
<p>New CFFI API static bindings.</p>
|
||||
<ul class="simple">
|
||||
<li><p>CFFI API static bindings.</p></li>
|
||||
<li><p>Automatically generated to be as close as possible to
|
||||
original Raylib.</p></li>
|
||||
<li><p>Faster, fewer bugs and easier to maintain than ctypes.</p></li>
|
||||
<li><p>Commercial-friendly license.</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>
|
||||
<p><a class="reference external" href="http://electronstudio.github.io/raylib-python-cffi">Full documentation</a></p>
|
||||
</section>
|
||||
</section>
|
||||
<section id="quickstart">
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span>
|
||||
<span class="n">begin_drawing</span><span class="p">()</span>
|
||||
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span>
|
||||
<span class="n">draw_text</span><span class="p">(</span><span class="s2">"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>
|
||||
<span class="n">end_drawing</span><span class="p">()</span>
|
||||
<span class="n">close_window</span><span class="p">()</span>
|
||||
<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-none notranslate"><div class="highlight"><pre><span></span>from pyray import *
|
||||
init_window(800, 450, "Hello")
|
||||
while not window_should_close():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
end_drawing()
|
||||
close_window()
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="installation">
|
||||
<h1>Installation<a class="headerlink" href="#installation" title="Link to this heading"></a></h1>
|
||||
<p>If you are on a modern Linux you will probably want to create a venv:</p>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Then make sure you have the latest pip installed:</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 pip install --upgrade pip
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Then install</p>
|
||||
<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>
|
||||
</div>
|
||||
<p>On most platforms it should install a binary wheel. If yours isn’t available then pip will attempt to build from
|
||||
source, in which case you will need to have Raylib development libs installed, e.g.
|
||||
<p>On most platforms it should install a binary wheel (Windows 10 x64, MacOS 12 x64/arm64, Linux Ubuntu2004 x64/arm64).</p>
|
||||
<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>
|
||||
<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">
|
||||
<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 id="backends">
|
||||
<h1>Backends<a class="headerlink" href="#backends" title="Link to this heading"></a></h1>
|
||||
<section id="dynamic-binding-version">
|
||||
<h2>Dynamic binding version<a class="headerlink" href="#dynamic-binding-version" title="Link to this heading"></a></h2>
|
||||
<p>There is now a separate dynamic version of this binding:</p>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib
|
||||
python3 -m pip install raylib_dynamic
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib_dynamic
|
||||
</pre></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>You can’t have multiple raylib packages installed at once.</p>
|
||||
</section>
|
||||
<section id="sdl-backend">
|
||||
<h2>SDL backend<a class="headerlink" href="#sdl-backend" title="Link to this heading"></a></h2>
|
||||
<p>This is not well tested but has better support for controllers:</p>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip uninstall raylib
|
||||
python3 -m pip install raylib_sdl
|
||||
<section id="beta-testing">
|
||||
<h2>Beta testing<a class="headerlink" href="#beta-testing" title="Link to this heading"></a></h2>
|
||||
<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>.
|
||||
You can install an alpha or beta version by specifying the exact version number like this:</p>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python3 -m pip install raylib==4.2.0.0.dev4
|
||||
</pre></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 id="problems">
|
||||
<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>
|
||||
<p>If you need help you can try asking on <a class="reference external" href="https://discord.gg/fKDwt85aX6">our discord</a>. There is also a large <a class="reference external" href="https://discord.gg/raylib">Raylib discord</a>
|
||||
for issues that are not Python-specific.</p>
|
||||
<p>If you need help you can try asking <a class="reference external" href="https://discord.gg/raylib">on Discord</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 id="how-to-use">
|
||||
<h1>How to use<a class="headerlink" href="#how-to-use" title="Link to this heading"></a></h1>
|
||||
<p>There are <em>two</em> modules in the raylib package, <code class="docutils literal notranslate"><span class="pre">raylib</span></code> and <code class="docutils literal notranslate"><span class="pre">pyray</span></code>. (There is no separate package for
|
||||
pyray. Do <em>not</em> <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pyray</span></code>). You can use either or both:</p>
|
||||
<p>There are two APIs, you can use either or both:</p>
|
||||
<section id="if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api">
|
||||
<h2>If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API<a class="headerlink" href="#if-you-are-familiar-with-c-coding-and-the-raylib-c-library-and-you-want-to-use-an-exact-copy-of-the-c-api" title="Link to this heading"></a></h2>
|
||||
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/raylib.html">the raylib module</a>.</p>
|
||||
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/raylib.html">the C API</a>.</p>
|
||||
</section>
|
||||
<section id="if-you-prefer-a-more-pythonistic-api">
|
||||
<h2>If you prefer a more Pythonistic API<a class="headerlink" href="#if-you-prefer-a-more-pythonistic-api" title="Link to this heading"></a></h2>
|
||||
<p>Use <a class="reference external" href="https://electronstudio.github.io/raylib-python-cffi/pyray.html">the pyray module</a>.</p>
|
||||
<section id="if-you-prefer-a-slightly-more-pythonistic-api-and-don-t-mind-it-might-be-slightly-slower">
|
||||
<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 Python API</a>.</p>
|
||||
</section>
|
||||
</section>
|
||||
<section id="running-in-a-web-browser">
|
||||
<h1>Running in a web browser<a class="headerlink" href="#running-in-a-web-browser" title="Link to this heading"></a></h1>
|
||||
<p><a class="reference external" href="https://pypi.org/project/pygbag/">Pygbag</a> >=0.8.7 supports running in a web browser. Usually the latest git version
|
||||
is recommended.</p>
|
||||
<p><a class="reference external" href="https://pypi.org/project/pygbag/">Pygbag</a> >=0.8.7 supports running in a web browser.</p>
|
||||
<p>Make a folder <code class="docutils literal notranslate"><span class="pre">my_project</span></code> with a file <code class="docutils literal notranslate"><span class="pre">main.py</span></code>:</p>
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># /// script</span>
|
||||
<span class="c1"># dependencies = [</span>
|
||||
<span class="c1"># "cffi",</span>
|
||||
<span class="c1"># "raylib"</span>
|
||||
<span class="c1"># ]</span>
|
||||
<span class="c1"># ///</span>
|
||||
<span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
|
||||
<span class="kn">import</span><span class="w"> </span><span class="nn">platform</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">pyray</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
|
||||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span># /// script
|
||||
# dependencies = [
|
||||
# "cffi",
|
||||
# "raylib"
|
||||
# ]
|
||||
# ///
|
||||
import asyncio
|
||||
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>
|
||||
<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>
|
||||
<span class="n">platform</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">window_resize</span><span class="p">()</span> <span class="c1"># You MAY want to add this line</span>
|
||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">window_should_close</span><span class="p">():</span>
|
||||
<span class="n">begin_drawing</span><span class="p">()</span>
|
||||
<span class="n">clear_background</span><span class="p">(</span><span class="n">WHITE</span><span class="p">)</span>
|
||||
<span class="n">draw_text</span><span class="p">(</span><span class="s2">"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>
|
||||
<span class="n">end_drawing</span><span class="p">()</span>
|
||||
<span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># You MUST call this in your main loop</span>
|
||||
<span class="n">close_window</span><span class="p">()</span>
|
||||
async def main(): # You must have an async main function
|
||||
init_window(500, 500, "Hello")
|
||||
platform.window.window_resize() # You must add this line
|
||||
while not window_should_close():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
end_drawing()
|
||||
await asyncio.sleep(0) # You must call this in your main loop
|
||||
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>
|
||||
</div>
|
||||
<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
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||
</pre></div>
|
||||
</div>
|
||||
<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.
|
||||
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>
|
||||
</section>
|
||||
<section id="app-showcase">
|
||||
<h1>App showcase<a class="headerlink" href="#app-showcase" title="Link to this heading"></a></h1>
|
||||
<p><a class="reference external" href="https://github.com/Emtyloc/tempest-raylib">Tempest-raylib</a></p>
|
||||
<p><a class="reference external" href="https://github.com/bilbofroggins/KarabinerKeyboard">KarabinerKeyboard</a></p>
|
||||
<p><a class="reference external" href="https://github.com/Yonokid/PyTaiko">PyTaiko</a></p>
|
||||
<p><a class="reference external" href="https://github.com/StanislavPetrovV/DOOM-Clone">DOOM-Clone</a></p>
|
||||
<p><a class="reference external" href="https://github.com/pkulev/tanki">Tanki</a></p>
|
||||
<p><a class="reference external" href="https://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>
|
||||
</section>
|
||||
<section id="rlzero">
|
||||
|
@ -324,9 +242,9 @@ Carefully read all their <a class="reference external" href="https://pygame-web.
|
|||
<li><p>Testing on more platforms</p></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="license">
|
||||
<h1>License<a class="headerlink" href="#license" title="Link to this heading"></a></h1>
|
||||
<p>Eclipse Public License, so you are free to
|
||||
<section id="license-updated">
|
||||
<h1>License (updated)<a class="headerlink" href="#license-updated" title="Link to this heading"></a></h1>
|
||||
<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>
|
||||
</section>
|
||||
<section id="performance">
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
|
@ -7,15 +5,19 @@
|
|||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
|
@ -44,16 +46,15 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul class="current">
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
|
||||
|
@ -102,9 +103,7 @@
|
|||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Alternatively there is a DRM wheel called <code class="docutils literal notranslate"><span class="pre">raylib_drm</span></code> to use the framebuffer without X11. You can’t have both wheels
|
||||
installed at once.</p>
|
||||
<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.
|
||||
<p>If it doesn’t work, or you’re not on Bullseye, or you’re 32 bit, 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.
|
||||
For full instructions on this, see <a class="reference external" href="https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi">https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi</a> . If you need help with this ask Raylib.</p>
|
||||
</section>
|
||||
<section id="option-2-compile-raylib-from-source-x11-mode">
|
||||
|
@ -125,7 +124,7 @@ For full instructions on this, see <a class="reference external" href="https://g
|
|||
</div>
|
||||
<p>Then have pip compile and install the wheel:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">setuptools</span>
|
||||
<span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="o">-</span><span class="nb">dir</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span><span class="o">==</span><span class="mf">5.5.0.0</span>
|
||||
<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.0.0.3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -158,7 +157,7 @@ For full instructions on this, see <a class="reference external" href="https://g
|
|||
</div>
|
||||
<p>Then have pip compile and install the wheel:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">setuptools</span>
|
||||
<span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="o">-</span><span class="nb">dir</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">binary</span> <span class="n">raylib</span> <span class="o">--</span><span class="n">upgrade</span> <span class="o">--</span><span class="n">force</span><span class="o">-</span><span class="n">reinstall</span> <span class="o">--</span><span class="k">break</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">packages</span> <span class="n">raylib</span><span class="o">==</span><span class="mf">5.5.0.0</span>
|
||||
<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.0.0.3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="admonition attention">
|
||||
|
|
|
@ -38,7 +38,7 @@ project.
|
|||
If the Pip build doesn’t work, please submit a bug. (And if you have
|
||||
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
|
||||
|
||||
Windows manual build
|
||||
|
|
|
@ -1,195 +1,124 @@
|
|||
# Python Bindings for Raylib 5.5
|
||||
## Libraries: raymath, raygui, rlgl, physac and GLFW
|
||||
## Backends: Desktop, SDL, DRM, Web
|
||||
## Platforms: Windows, Mac, Linux, Raspberry Pi, Web
|
||||
# Python Bindings for Raylib 5.0
|
||||
|
||||

|
||||
Chatroom: [Discord](https://discord.gg/fKDwt85aX6) or [Matrix](https://matrix.to/#/#raylib-python-cffi:matrix.org)
|
||||
|
||||
Chatroom: [Discord](https://discord.gg/fKDwt85aX6)
|
||||
|
||||
HELP WANTED: [writing examples](https://github.com/electronstudio/raylib-python-cffi/issues/155)
|
||||
|
||||
Features:
|
||||
|
||||
* CFFI API static bindings.
|
||||
New CFFI API static bindings.
|
||||
* Automatically generated to be as close as possible to
|
||||
original Raylib.
|
||||
* Faster, fewer bugs and easier to maintain than ctypes.
|
||||
* Commercial-friendly license.
|
||||
* 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)
|
||||
|
||||
# Quickstart
|
||||
|
||||
`pip3 install raylib==5.5.0.2 --break-system-packages`
|
||||
```python
|
||||
from pyray import *
|
||||
init_window(800, 450, "Hello")
|
||||
while not window_should_close():
|
||||
`pip3 install raylib`
|
||||
|
||||
from pyray import *
|
||||
init_window(800, 450, "Hello")
|
||||
while not window_should_close():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
end_drawing()
|
||||
close_window()
|
||||
```
|
||||
close_window()
|
||||
|
||||
|
||||
# Installation
|
||||
|
||||
If you are on a modern Linux you will probably want to create a venv:
|
||||
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
|
||||
Then make sure you have the latest pip installed:
|
||||
First make sure you have the latest pip installed:
|
||||
|
||||
python3 -m pip install --upgrade pip
|
||||
|
||||
Then install
|
||||
|
||||
python3 -m pip install setuptools
|
||||
python3 -m pip install raylib==5.5.0.2
|
||||
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
|
||||
source, in which case you will need to have Raylib development libs installed, e.g.
|
||||
On most platforms it should install a binary wheel (Windows 10 x64, MacOS 12 x64/arm64, Linux Ubuntu2004 x64/arm64).
|
||||
|
||||
If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g.
|
||||
using homebrew, apt, etc.
|
||||
|
||||
## Windows
|
||||
|
||||
Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)
|
||||
|
||||
Use an [official Windows Python release](https://www.python.org/downloads/windows/) rather than WSL, MSYS, etc.
|
||||
|
||||
## MacOS
|
||||
|
||||
Binaries require:
|
||||
* arm64 MacOS 14
|
||||
* x64 MacOS 10.13, or newer.
|
||||
|
||||
Older MacOS requires building from source but this is usually simple:
|
||||
|
||||
brew install pkg-config
|
||||
brew install raylib
|
||||
python3 -m pip install raylib==5.5.0.2
|
||||
|
||||
(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue
|
||||
if you want to test them.)
|
||||
|
||||
## Linux
|
||||
|
||||
Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source.
|
||||
(Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)
|
||||
|
||||
The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0
|
||||
so may not work on other boards.
|
||||
|
||||
## Raspberry Pi
|
||||
|
||||
[Using on Rasperry Pi](RPI.rst)
|
||||
|
||||
# Backends
|
||||
|
||||
## Dynamic binding version
|
||||
|
||||
There is now a separate dynamic version of this binding:
|
||||
|
||||
python3 -m pip uninstall raylib
|
||||
python3 -m pip install raylib_dynamic
|
||||
|
||||
It works on some systems where the static version doesn't, [but be sure to read these caveats before using it](https://electronstudio.github.io/raylib-python-cffi/dynamic.html)
|
||||
|
||||
You can't have multiple raylib packages installed at once.
|
||||
## 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 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.
|
||||
python3 -m pip install raylib==4.2.0.0.dev4
|
||||
|
||||
## Problems?
|
||||
|
||||
If it doesn't work, [try to build manually.](BUILDING.rst). If that works then [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues)
|
||||
to let us know what you did.
|
||||
|
||||
If you need help you can try asking on [our discord](https://discord.gg/fKDwt85aX6). There is also a large [Raylib discord](https://discord.gg/raylib)
|
||||
for issues that are not Python-specific.
|
||||
If you need help you can try asking [on Discord](https://discord.gg/raylib).
|
||||
|
||||
If it still doesn't work, [submit an issue](https://github.com/electronstudio/raylib-python-cffi/issues).
|
||||
|
||||
|
||||
# How to use
|
||||
|
||||
There are *two* modules in the raylib package, `raylib` and `pyray`. (There is no separate package for
|
||||
pyray. Do *not* `pip install pyray`). You can use either or both:
|
||||
There are two APIs, you can use either or both:
|
||||
|
||||
### If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API
|
||||
|
||||
Use [the 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
|
||||
|
||||
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser. Usually the latest git version
|
||||
is recommended.
|
||||
[Pygbag](https://pypi.org/project/pygbag/) >=0.8.7 supports running in a web browser.
|
||||
|
||||
Make a folder `my_project` with a file `main.py`:
|
||||
|
||||
```python
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "cffi",
|
||||
# "raylib"
|
||||
# ]
|
||||
# ///
|
||||
import asyncio
|
||||
import platform
|
||||
from pyray import *
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "cffi",
|
||||
# "raylib"
|
||||
# ]
|
||||
# ///
|
||||
import asyncio
|
||||
import platform
|
||||
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")
|
||||
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():
|
||||
begin_drawing()
|
||||
clear_background(WHITE)
|
||||
draw_text("Hello world", 190, 200, 20, VIOLET)
|
||||
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()
|
||||
|
||||
asyncio.run(main())
|
||||
```
|
||||
asyncio.run(main())
|
||||
|
||||
Then to create the web files and launch a web server:
|
||||
|
||||
python3.12 -m pip install --user --upgrade pygbag
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project
|
||||
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl my_project
|
||||
|
||||
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.
|
||||
Carefully read all their [documentation](https://pygame-web.github.io/).
|
||||
|
||||
|
@ -197,20 +126,10 @@ It does work for most of [these examples](https://electronstudio.github.io/rayli
|
|||
|
||||
# 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)
|
||||
|
||||
[Alloy Bloxel Editor](https://pebaz.itch.io/alloy-bloxel-editor)
|
||||
|
||||
[Eidolon](https://github.com/Miou-zora/Eidolon)
|
||||
|
||||
Add your app here!
|
||||
|
||||
# RLZero
|
||||
|
@ -224,9 +143,9 @@ A related library (that is a work in progress!):
|
|||
* Converting more examples from C to Python
|
||||
* 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!
|
||||
|
||||
# Performance
|
||||
|
|
|
@ -12,10 +12,7 @@ We have published binary wheels compiled for 64-bit Raspberry OS Bullseye in X11
|
|||
|
||||
python -m pip install --break-system-packages raylib
|
||||
|
||||
Alternatively there is a DRM wheel called ``raylib_drm`` to use the framebuffer without X11. You can't have both wheels
|
||||
installed at once.
|
||||
|
||||
If it doesn't work, or you're not on Bullseye, or you're 32 bit, you will need to compile your own raylib. See below.
|
||||
If it doesn't work, or you're not on Bullseye, or you're 32 bit, or if you want to use Raylib in ``PLATFORM_DRM`` mode, you will need to compile your own raylib. See below.
|
||||
For full instructions on this, see https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi . If you need help with this ask Raylib.
|
||||
|
||||
Option 2: Compile Raylib from source X11 mode
|
||||
|
@ -42,7 +39,7 @@ Then have pip compile and install the wheel:
|
|||
::
|
||||
|
||||
python3 -m pip install --break-system-packages setuptools
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.0.0.3
|
||||
|
||||
Option 3: Compile Raylib from source DRM mode
|
||||
---------------------------------------------
|
||||
|
@ -85,7 +82,7 @@ Then have pip compile and install the wheel:
|
|||
::
|
||||
|
||||
python3 -m pip install --break-system-packages setuptools
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.5.0.0
|
||||
python3 -m pip install --no-cache-dir --no-binary raylib --upgrade --force-reinstall --break-system-packages raylib==5.0.0.3
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ Example program:
|
|||
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>`_
|
||||
|
||||
|
|
23
docs/_static/basic.css
vendored
23
docs/_static/basic.css
vendored
|
@ -1,5 +1,12 @@
|
|||
/*
|
||||
* basic.css
|
||||
* ~~~~~~~~~
|
||||
*
|
||||
* Sphinx stylesheet -- basic theme.
|
||||
*
|
||||
* :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* -- main layout ----------------------------------------------------------- */
|
||||
|
@ -108,11 +115,15 @@ img {
|
|||
/* -- search page ----------------------------------------------------------- */
|
||||
|
||||
ul.search {
|
||||
margin-top: 10px;
|
||||
margin: 10px 0 0 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
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 {
|
||||
|
@ -741,6 +752,14 @@ abbr, acronym {
|
|||
cursor: help;
|
||||
}
|
||||
|
||||
.translated {
|
||||
background-color: rgba(207, 255, 207, 0.2)
|
||||
}
|
||||
|
||||
.untranslated {
|
||||
background-color: rgba(255, 207, 207, 0.2)
|
||||
}
|
||||
|
||||
/* -- code displays --------------------------------------------------------- */
|
||||
|
||||
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.
|
||||
*
|
||||
* :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
"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.
|
||||
*
|
||||
* :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
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);
|
||||
});
|
||||
});
|
7
docs/_static/language_data.js
vendored
7
docs/_static/language_data.js
vendored
|
@ -1,6 +1,13 @@
|
|||
/*
|
||||
* language_data.js
|
||||
* ~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This script contains the language-specific data used by searchtools.js,
|
||||
* namely the list of stopwords, stemmer, scorer and splitter.
|
||||
*
|
||||
* :copyright: Copyright 2007-2024 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"];
|
||||
|
|
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 { background: #eeffcc; }
|
||||
.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 .o { color: #666 } /* Operator */
|
||||
.highlight .o { color: #666666 } /* Operator */
|
||||
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
|
||||
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #007020 } /* Comment.Preproc */
|
||||
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
|
||||
.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 .ge { font-style: italic } /* Generic.Emph */
|
||||
.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 .gi { color: #00A000 } /* Generic.Inserted */
|
||||
.highlight .go { color: #333 } /* Generic.Output */
|
||||
.highlight .gp { color: #C65D09; font-weight: bold } /* Generic.Prompt */
|
||||
.highlight .go { color: #333333 } /* Generic.Output */
|
||||
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.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 .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
|
||||
.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 .kt { color: #902000 } /* Keyword.Type */
|
||||
.highlight .m { color: #208050 } /* Literal.Number */
|
||||
.highlight .s { color: #4070A0 } /* Literal.String */
|
||||
.highlight .na { color: #4070A0 } /* Name.Attribute */
|
||||
.highlight .s { color: #4070a0 } /* Literal.String */
|
||||
.highlight .na { color: #4070a0 } /* Name.Attribute */
|
||||
.highlight .nb { color: #007020 } /* Name.Builtin */
|
||||
.highlight .nc { color: #0E84B5; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #60ADD5 } /* Name.Constant */
|
||||
.highlight .nd { color: #555; font-weight: bold } /* Name.Decorator */
|
||||
.highlight .ni { color: #D55537; font-weight: bold } /* Name.Entity */
|
||||
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #60add5 } /* Name.Constant */
|
||||
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
|
||||
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
|
||||
.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 .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 .nv { color: #BB60D5 } /* Name.Variable */
|
||||
.highlight .nv { color: #bb60d5 } /* Name.Variable */
|
||||
.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 .mf { color: #208050 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
|
||||
.highlight .sa { color: #4070A0 } /* Literal.String.Affix */
|
||||
.highlight .sb { color: #4070A0 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #4070A0 } /* Literal.String.Char */
|
||||
.highlight .dl { color: #4070A0 } /* Literal.String.Delimiter */
|
||||
.highlight .sd { color: #4070A0; font-style: italic } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #4070A0 } /* Literal.String.Double */
|
||||
.highlight .se { color: #4070A0; font-weight: bold } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #4070A0 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #70A0D0; font-style: italic } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #C65D09 } /* Literal.String.Other */
|
||||
.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
|
||||
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
|
||||
.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
|
||||
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
|
||||
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
|
||||
.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 .bp { color: #007020 } /* Name.Builtin.Pseudo */
|
||||
.highlight .fm { color: #06287E } /* Name.Function.Magic */
|
||||
.highlight .vc { color: #BB60D5 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #BB60D5 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #BB60D5 } /* Name.Variable.Instance */
|
||||
.highlight .vm { color: #BB60D5 } /* Name.Variable.Magic */
|
||||
.highlight .fm { color: #06287e } /* Name.Function.Magic */
|
||||
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
|
||||
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
|
||||
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
|
58
docs/_static/searchtools.js
vendored
58
docs/_static/searchtools.js
vendored
|
@ -1,5 +1,12 @@
|
|||
/*
|
||||
* searchtools.js
|
||||
* ~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* Sphinx JavaScript utilities for the full-text search.
|
||||
*
|
||||
* :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
|
@ -13,7 +20,7 @@ if (typeof Scorer === "undefined") {
|
|||
// and returns the new score.
|
||||
/*
|
||||
score: result => {
|
||||
const [docname, title, anchor, descr, score, filename, kind] = result
|
||||
const [docname, title, anchor, descr, score, filename] = result
|
||||
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) => {
|
||||
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 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");
|
||||
// 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 linkUrl;
|
||||
if (docBuilder === "dirhtml") {
|
||||
|
@ -120,10 +115,8 @@ 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."
|
||||
);
|
||||
else
|
||||
Search.status.innerText = Documentation.ngettext(
|
||||
"Search finished, found one page matching the search query.",
|
||||
"Search finished, found ${resultCount} pages matching the search query.",
|
||||
resultCount,
|
||||
Search.status.innerText = _(
|
||||
"Search finished, found ${resultCount} page(s) matching the search query."
|
||||
).replace('${resultCount}', resultCount);
|
||||
};
|
||||
const _displayNextItem = (
|
||||
|
@ -145,7 +138,7 @@ const _displayNextItem = (
|
|||
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].
|
||||
// Each input is an array of [docname, title, anchor, descr, score, filename].
|
||||
// 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) => {
|
||||
|
@ -185,7 +178,7 @@ const Search = {
|
|||
|
||||
htmlToText: (htmlString, anchor) => {
|
||||
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
|
||||
for (const removalQuery of [".headerlink", "script", "style"]) {
|
||||
for (const removalQuery of [".headerlinks", "script", "style"]) {
|
||||
htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
|
||||
}
|
||||
if (anchor) {
|
||||
|
@ -255,7 +248,6 @@ const Search = {
|
|||
searchSummary.classList.add("search-summary");
|
||||
searchSummary.innerText = "";
|
||||
const searchList = document.createElement("ul");
|
||||
searchList.setAttribute("role", "list");
|
||||
searchList.classList.add("search");
|
||||
|
||||
const out = document.getElementById("search-results");
|
||||
|
@ -326,7 +318,7 @@ const Search = {
|
|||
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].
|
||||
// Each is an array of [docname, title, anchor, descr, score, filename].
|
||||
const normalResults = [];
|
||||
const nonMainIndexResults = [];
|
||||
|
||||
|
@ -336,16 +328,14 @@ const Search = {
|
|||
for (const [title, foundTitles] of Object.entries(allTitles)) {
|
||||
if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
|
||||
for (const [file, id] of foundTitles) {
|
||||
const score = Math.round(Scorer.title * queryLower.length / title.length);
|
||||
const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
|
||||
let score = Math.round(100 * queryLower.length / title.length)
|
||||
normalResults.push([
|
||||
docNames[file],
|
||||
titles[file] !== title ? `${titles[file]} > ${title}` : title,
|
||||
id !== null ? "#" + id : "",
|
||||
null,
|
||||
score + boost,
|
||||
score,
|
||||
filenames[file],
|
||||
SearchResultKind.title,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -363,7 +353,6 @@ const Search = {
|
|||
null,
|
||||
score,
|
||||
filenames[file],
|
||||
SearchResultKind.index,
|
||||
];
|
||||
if (isMain) {
|
||||
normalResults.push(result);
|
||||
|
@ -485,7 +474,6 @@ const Search = {
|
|||
descr,
|
||||
score,
|
||||
filenames[match[0]],
|
||||
SearchResultKind.object,
|
||||
]);
|
||||
};
|
||||
Object.keys(objects).forEach((prefix) =>
|
||||
|
@ -513,11 +501,9 @@ const Search = {
|
|||
// perform the search on the required terms
|
||||
searchTerms.forEach((word) => {
|
||||
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 = [
|
||||
{ files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term },
|
||||
{ files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title },
|
||||
{ files: terms[word], score: Scorer.term },
|
||||
{ files: titleTerms[word], score: Scorer.title },
|
||||
];
|
||||
// add support for partial matches
|
||||
if (word.length > 2) {
|
||||
|
@ -549,9 +535,8 @@ const Search = {
|
|||
|
||||
// set score for the word in each file
|
||||
recordFiles.forEach((file) => {
|
||||
if (!scoreMap.has(file)) scoreMap.set(file, new Map());
|
||||
const fileScores = scoreMap.get(file);
|
||||
fileScores.set(word, record.score);
|
||||
if (!scoreMap.has(file)) scoreMap.set(file, {});
|
||||
scoreMap.get(file)[word] = record.score;
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -590,7 +575,7 @@ const Search = {
|
|||
break;
|
||||
|
||||
// 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
|
||||
results.push([
|
||||
docNames[file],
|
||||
|
@ -599,7 +584,6 @@ const Search = {
|
|||
null,
|
||||
score,
|
||||
filenames[file],
|
||||
SearchResultKind.text,
|
||||
]);
|
||||
}
|
||||
return results;
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
|
@ -7,15 +5,19 @@
|
|||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
|
@ -45,16 +47,15 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul class="current">
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">Python Bindings for Raylib 5.5</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html">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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</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>
|
||||
</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>
|
||||
<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>
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
<p>Then you access the functions with <code class="docutils literal notranslate"><span class="pre">rl.</span></code> prefix.</p>
|
||||
|
|
2629
docs/genindex.html
2629
docs/genindex.html
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
|
@ -7,20 +5,24 @@
|
|||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
<link rel="search" title="Search" href="search.html" />
|
||||
<link rel="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>
|
||||
|
||||
<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">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</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">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
|
||||
|
@ -122,7 +122,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
<hr/>
|
||||
|
|
BIN
docs/objects.inv
BIN
docs/objects.inv
Binary file not shown.
|
@ -1,20 +1,22 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
|
@ -49,16 +51,15 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul>
|
||||
<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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#advert">Advert</a></li>
|
||||
|
|
9057
docs/pyray.html
9057
docs/pyray.html
File diff suppressed because one or more lines are too long
8789
docs/raylib.html
8789
docs/raylib.html
File diff suppressed because one or more lines are too long
|
@ -1,21 +1,23 @@
|
|||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html class="writer-html5" lang="en" data-content_root="./">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<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/css/theme.css?v=e59714d7" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=4ae1632d" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
||||
<link rel="stylesheet" type="text/css" href="_static/graphviz.css?v=fd3f3429" />
|
||||
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="_static/js/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script src="_static/jquery.js?v=5d32c60e"></script>
|
||||
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||||
<script src="_static/documentation_options.js?v=5929fcd5"></script>
|
||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||
<script src="_static/js/theme.js"></script>
|
||||
<script src="_static/searchtools.js"></script>
|
||||
|
@ -45,16 +47,15 @@
|
|||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||||
<ul>
|
||||
<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#installation">Installation</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#backends">Backends</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#how-to-use">How to use</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#running-in-a-web-browser">Running in a web browser</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#app-showcase">App showcase</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#rlzero">RLZero</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#help-wanted">Help wanted</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#license">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="README.html#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#packaging-your-app">Packaging your app</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
|
@ -9,5 +9,3 @@ include version.py
|
|||
exclude raylib/*.a
|
||||
exclude raylib/*.c
|
||||
exclude raylib/*.o
|
||||
include raylib/py.typed
|
||||
include pyray/py.typed
|
|
@ -22,10 +22,9 @@ import itertools
|
|||
import os
|
||||
import pathlib
|
||||
import platform
|
||||
import logging
|
||||
from .version import __version__
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
MODULE = pathlib.Path(__file__).parent
|
||||
|
||||
def raylib_library_path():
|
||||
|
@ -55,9 +54,9 @@ ffi.cdef(open(MODULE / "raylib_modified.h").read().replace('RLAPI ', ''))
|
|||
try:
|
||||
raylib_fname = raylib_library_path()
|
||||
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:
|
||||
logger.exception(e)
|
||||
print(e)
|
||||
|
||||
LIGHTGRAY =( 200, 200, 200, 255 )
|
||||
GRAY =( 130, 130, 130, 255 )
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,9 +1,9 @@
|
|||
import raylib
|
||||
|
||||
RAYLIB_VERSION_MAJOR: int = 5
|
||||
RAYLIB_VERSION_MINOR: int = 5
|
||||
RAYLIB_VERSION_MINOR: int = 0
|
||||
RAYLIB_VERSION_PATCH: int = 0
|
||||
RAYLIB_VERSION: str = "5.5"
|
||||
RAYLIB_VERSION: str = "5.0"
|
||||
PI: float = 3.141592653589793
|
||||
DEG2RAD = PI / 180.0
|
||||
RAD2DEG = 180.0 / PI
|
||||
|
@ -14,8 +14,11 @@ MATERIAL_MAP_DIFFUSE = raylib.MATERIAL_MAP_ALBEDO
|
|||
MATERIAL_MAP_SPECULAR = raylib.MATERIAL_MAP_METALNESS
|
||||
SHADER_LOC_MAP_DIFFUSE = raylib.SHADER_LOC_MAP_ALBEDO
|
||||
SHADER_LOC_MAP_SPECULAR = raylib.SHADER_LOC_MAP_METALNESS
|
||||
PI: float = 3.141592653589793
|
||||
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_BUFFERS: int = 1
|
||||
RL_DEFAULT_BATCH_DRAWCALLS: int = 256
|
||||
|
@ -86,19 +89,11 @@ RL_BLEND_SRC_RGB: int = 32969
|
|||
RL_BLEND_DST_ALPHA: int = 32970
|
||||
RL_BLEND_SRC_ALPHA: int = 32971
|
||||
RL_BLEND_COLOR: int = 32773
|
||||
RL_READ_FRAMEBUFFER: int = 36008
|
||||
RL_DRAW_FRAMEBUFFER: int = 36009
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION: int = 0
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD: int = 1
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL: int = 2
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR: int = 3
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT: int = 4
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2: int = 5
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES: int = 6
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS: int = 7
|
||||
RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS: int = 8
|
||||
RL_SHADER_LOC_MAP_DIFFUSE = raylib.RL_SHADER_LOC_MAP_ALBEDO
|
||||
RL_SHADER_LOC_MAP_SPECULAR = raylib.RL_SHADER_LOC_MAP_METALNESS
|
||||
PI: float = 3.141592653589793
|
||||
DEG2RAD = PI / 180.0
|
||||
RAD2DEG = 180.0 / PI
|
||||
GL_SHADING_LANGUAGE_VERSION: int = 35724
|
||||
GL_COMPRESSED_RGB_S3TC_DXT1_EXT: int = 33776
|
||||
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_MAX_TEXTURE_MAX_ANISOTROPY_EXT: int = 34047
|
||||
GL_TEXTURE_MAX_ANISOTROPY_EXT: int = 34046
|
||||
GL_PROGRAM_POINT_SIZE: int = 34370
|
||||
GL_LINE_WIDTH: int = 2849
|
||||
GL_UNSIGNED_SHORT_5_6_5: int = 33635
|
||||
GL_UNSIGNED_SHORT_5_5_5_1: int = 32820
|
||||
GL_UNSIGNED_SHORT_4_4_4_4: int = 32819
|
||||
|
@ -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_TANGENT: str = "vertexTangent"
|
||||
RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2: str = "vertexTexCoord2"
|
||||
RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS: str = "vertexBoneIds"
|
||||
RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS: str = "vertexBoneWeights"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_MVP: str = "mvp"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW: str = "matView"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION: str = "matProjection"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL: str = "matModel"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL: str = "matNormal"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR: str = "colDiffuse"
|
||||
RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES: str = "boneMatrices"
|
||||
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0: str = "texture0"
|
||||
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1: str = "texture1"
|
||||
RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2: str = "texture2"
|
||||
RAYGUI_VERSION_MAJOR: int = 4
|
||||
RAYGUI_VERSION_MINOR: int = 5
|
||||
RAYGUI_VERSION_MINOR: int = 0
|
||||
RAYGUI_VERSION_PATCH: int = 0
|
||||
RAYGUI_VERSION: str = "4.5-dev"
|
||||
RAYGUI_VERSION: str = "4.0"
|
||||
SCROLLBAR_LEFT_SIDE: int = 0
|
||||
SCROLLBAR_RIGHT_SIDE: int = 1
|
||||
RAYGUI_ICON_SIZE: int = 16
|
||||
|
@ -165,7 +155,6 @@ RAYGUI_PANEL_BORDER_WIDTH: int = 1
|
|||
RAYGUI_TABBAR_ITEM_WIDTH: int = 160
|
||||
RAYGUI_MIN_SCROLLBAR_WIDTH: int = 40
|
||||
RAYGUI_MIN_SCROLLBAR_HEIGHT: int = 40
|
||||
RAYGUI_MIN_MOUSE_WHEEL_SPEED: int = 20
|
||||
RAYGUI_TOGGLEGROUP_MAX_ITEMS: int = 32
|
||||
RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN: int = 40
|
||||
RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY: int = 1
|
||||
|
@ -186,10 +175,12 @@ RAYGUI_TEXTFORMAT_MAX_SIZE: int = 256
|
|||
PHYSAC_MAX_BODIES: int = 64
|
||||
PHYSAC_MAX_MANIFOLDS: int = 4096
|
||||
PHYSAC_MAX_VERTICES: int = 24
|
||||
PHYSAC_CIRCLE_VERTICES: int = 24
|
||||
PHYSAC_COLLISION_ITERATIONS: int = 20
|
||||
PHYSAC_DEFAULT_CIRCLE_VERTICES: int = 24
|
||||
PHYSAC_COLLISION_ITERATIONS: int = 100
|
||||
PHYSAC_PENETRATION_ALLOWANCE: float = 0.05
|
||||
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_EPSILON: float = 1e-06
|
||||
GLFW_VERSION_MAJOR: int = 3
|
||||
|
@ -438,14 +429,12 @@ GLFW_CONTEXT_RELEASE_BEHAVIOR: int = 139273
|
|||
GLFW_CONTEXT_NO_ERROR: int = 139274
|
||||
GLFW_CONTEXT_CREATION_API: int = 139275
|
||||
GLFW_SCALE_TO_MONITOR: int = 139276
|
||||
GLFW_SCALE_FRAMEBUFFER: int = 139277
|
||||
GLFW_COCOA_RETINA_FRAMEBUFFER: int = 143361
|
||||
GLFW_COCOA_FRAME_NAME: int = 143362
|
||||
GLFW_COCOA_GRAPHICS_SWITCHING: int = 143363
|
||||
GLFW_X11_CLASS_NAME: int = 147457
|
||||
GLFW_X11_INSTANCE_NAME: int = 147458
|
||||
GLFW_WIN32_KEYBOARD_MENU: int = 151553
|
||||
GLFW_WIN32_SHOWDEFAULT: int = 151554
|
||||
GLFW_WAYLAND_APP_ID: int = 155649
|
||||
GLFW_NO_API: int = 0
|
||||
GLFW_OPENGL_API: int = 196609
|
||||
|
@ -478,8 +467,6 @@ GLFW_ANGLE_PLATFORM_TYPE_D3D9: int = 225284
|
|||
GLFW_ANGLE_PLATFORM_TYPE_D3D11: int = 225285
|
||||
GLFW_ANGLE_PLATFORM_TYPE_VULKAN: int = 225287
|
||||
GLFW_ANGLE_PLATFORM_TYPE_METAL: int = 225288
|
||||
GLFW_WAYLAND_PREFER_LIBDECOR: int = 229377
|
||||
GLFW_WAYLAND_DISABLE_LIBDECOR: int = 229378
|
||||
GLFW_ANY_POSITION: int = 2147483648
|
||||
GLFW_ARROW_CURSOR: int = 221185
|
||||
GLFW_IBEAM_CURSOR: int = 221186
|
||||
|
@ -499,7 +486,6 @@ GLFW_PLATFORM: int = 327683
|
|||
GLFW_COCOA_CHDIR_RESOURCES: int = 331777
|
||||
GLFW_COCOA_MENUBAR: int = 331778
|
||||
GLFW_X11_XCB_VULKAN_SURFACE: int = 335873
|
||||
GLFW_WAYLAND_LIBDECOR: int = 339969
|
||||
GLFW_ANY_PLATFORM: int = 393216
|
||||
GLFW_PLATFORM_WIN32: int = 393217
|
||||
GLFW_PLATFORM_COCOA: int = 393218
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
from enum import IntEnum
|
||||
|
||||
class ConfigFlags(IntEnum):
|
||||
"""System/Window config flags."""
|
||||
FLAG_VSYNC_HINT = 64
|
||||
FLAG_FULLSCREEN_MODE = 2
|
||||
FLAG_WINDOW_RESIZABLE = 4
|
||||
|
@ -20,7 +19,6 @@ class ConfigFlags(IntEnum):
|
|||
FLAG_INTERLACED_HINT = 65536
|
||||
|
||||
class TraceLogLevel(IntEnum):
|
||||
"""Trace log level."""
|
||||
LOG_ALL = 0
|
||||
LOG_TRACE = 1
|
||||
LOG_DEBUG = 2
|
||||
|
@ -31,7 +29,6 @@ class TraceLogLevel(IntEnum):
|
|||
LOG_NONE = 7
|
||||
|
||||
class KeyboardKey(IntEnum):
|
||||
"""Keyboard keys (US keyboard layout)."""
|
||||
KEY_NULL = 0
|
||||
KEY_APOSTROPHE = 39
|
||||
KEY_COMMA = 44
|
||||
|
@ -139,12 +136,11 @@ class KeyboardKey(IntEnum):
|
|||
KEY_KP_ENTER = 335
|
||||
KEY_KP_EQUAL = 336
|
||||
KEY_BACK = 4
|
||||
KEY_MENU = 5
|
||||
KEY_MENU = 82
|
||||
KEY_VOLUME_UP = 24
|
||||
KEY_VOLUME_DOWN = 25
|
||||
|
||||
class MouseButton(IntEnum):
|
||||
"""Mouse buttons."""
|
||||
MOUSE_BUTTON_LEFT = 0
|
||||
MOUSE_BUTTON_RIGHT = 1
|
||||
MOUSE_BUTTON_MIDDLE = 2
|
||||
|
@ -154,7 +150,6 @@ class MouseButton(IntEnum):
|
|||
MOUSE_BUTTON_BACK = 6
|
||||
|
||||
class MouseCursor(IntEnum):
|
||||
"""Mouse cursor."""
|
||||
MOUSE_CURSOR_DEFAULT = 0
|
||||
MOUSE_CURSOR_ARROW = 1
|
||||
MOUSE_CURSOR_IBEAM = 2
|
||||
|
@ -168,7 +163,6 @@ class MouseCursor(IntEnum):
|
|||
MOUSE_CURSOR_NOT_ALLOWED = 10
|
||||
|
||||
class GamepadButton(IntEnum):
|
||||
"""Gamepad buttons."""
|
||||
GAMEPAD_BUTTON_UNKNOWN = 0
|
||||
GAMEPAD_BUTTON_LEFT_FACE_UP = 1
|
||||
GAMEPAD_BUTTON_LEFT_FACE_RIGHT = 2
|
||||
|
@ -189,7 +183,6 @@ class GamepadButton(IntEnum):
|
|||
GAMEPAD_BUTTON_RIGHT_THUMB = 17
|
||||
|
||||
class GamepadAxis(IntEnum):
|
||||
"""Gamepad axis."""
|
||||
GAMEPAD_AXIS_LEFT_X = 0
|
||||
GAMEPAD_AXIS_LEFT_Y = 1
|
||||
GAMEPAD_AXIS_RIGHT_X = 2
|
||||
|
@ -198,7 +191,6 @@ class GamepadAxis(IntEnum):
|
|||
GAMEPAD_AXIS_RIGHT_TRIGGER = 5
|
||||
|
||||
class MaterialMapIndex(IntEnum):
|
||||
"""Material map index."""
|
||||
MATERIAL_MAP_ALBEDO = 0
|
||||
MATERIAL_MAP_METALNESS = 1
|
||||
MATERIAL_MAP_NORMAL = 2
|
||||
|
@ -212,7 +204,6 @@ class MaterialMapIndex(IntEnum):
|
|||
MATERIAL_MAP_BRDF = 10
|
||||
|
||||
class ShaderLocationIndex(IntEnum):
|
||||
"""Shader location index."""
|
||||
SHADER_LOC_VERTEX_POSITION = 0
|
||||
SHADER_LOC_VERTEX_TEXCOORD01 = 1
|
||||
SHADER_LOC_VERTEX_TEXCOORD02 = 2
|
||||
|
@ -239,12 +230,8 @@ class ShaderLocationIndex(IntEnum):
|
|||
SHADER_LOC_MAP_IRRADIANCE = 23
|
||||
SHADER_LOC_MAP_PREFILTER = 24
|
||||
SHADER_LOC_MAP_BRDF = 25
|
||||
SHADER_LOC_VERTEX_BONEIDS = 26
|
||||
SHADER_LOC_VERTEX_BONEWEIGHTS = 27
|
||||
SHADER_LOC_BONE_MATRICES = 28
|
||||
|
||||
class ShaderUniformDataType(IntEnum):
|
||||
"""Shader uniform data type."""
|
||||
SHADER_UNIFORM_FLOAT = 0
|
||||
SHADER_UNIFORM_VEC2 = 1
|
||||
SHADER_UNIFORM_VEC3 = 2
|
||||
|
@ -256,14 +243,12 @@ class ShaderUniformDataType(IntEnum):
|
|||
SHADER_UNIFORM_SAMPLER2D = 8
|
||||
|
||||
class ShaderAttributeDataType(IntEnum):
|
||||
"""Shader attribute data types."""
|
||||
SHADER_ATTRIB_FLOAT = 0
|
||||
SHADER_ATTRIB_VEC2 = 1
|
||||
SHADER_ATTRIB_VEC3 = 2
|
||||
SHADER_ATTRIB_VEC4 = 3
|
||||
|
||||
class PixelFormat(IntEnum):
|
||||
"""Pixel formats."""
|
||||
PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1
|
||||
PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA = 2
|
||||
PIXELFORMAT_UNCOMPRESSED_R5G6B5 = 3
|
||||
|
@ -290,7 +275,6 @@ class PixelFormat(IntEnum):
|
|||
PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 24
|
||||
|
||||
class TextureFilter(IntEnum):
|
||||
"""Texture parameters: filter mode."""
|
||||
TEXTURE_FILTER_POINT = 0
|
||||
TEXTURE_FILTER_BILINEAR = 1
|
||||
TEXTURE_FILTER_TRILINEAR = 2
|
||||
|
@ -299,28 +283,25 @@ class TextureFilter(IntEnum):
|
|||
TEXTURE_FILTER_ANISOTROPIC_16X = 5
|
||||
|
||||
class TextureWrap(IntEnum):
|
||||
"""Texture parameters: wrap mode."""
|
||||
TEXTURE_WRAP_REPEAT = 0
|
||||
TEXTURE_WRAP_CLAMP = 1
|
||||
TEXTURE_WRAP_MIRROR_REPEAT = 2
|
||||
TEXTURE_WRAP_MIRROR_CLAMP = 3
|
||||
|
||||
class CubemapLayout(IntEnum):
|
||||
"""Cubemap layouts."""
|
||||
CUBEMAP_LAYOUT_AUTO_DETECT = 0
|
||||
CUBEMAP_LAYOUT_LINE_VERTICAL = 1
|
||||
CUBEMAP_LAYOUT_LINE_HORIZONTAL = 2
|
||||
CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR = 3
|
||||
CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE = 4
|
||||
CUBEMAP_LAYOUT_PANORAMA = 5
|
||||
|
||||
class FontType(IntEnum):
|
||||
"""Font type, defines generation method."""
|
||||
FONT_DEFAULT = 0
|
||||
FONT_BITMAP = 1
|
||||
FONT_SDF = 2
|
||||
|
||||
class BlendMode(IntEnum):
|
||||
"""Color blending modes (pre-defined)."""
|
||||
BLEND_ALPHA = 0
|
||||
BLEND_ADDITIVE = 1
|
||||
BLEND_MULTIPLIED = 2
|
||||
|
@ -331,7 +312,6 @@ class BlendMode(IntEnum):
|
|||
BLEND_CUSTOM_SEPARATE = 7
|
||||
|
||||
class Gesture(IntEnum):
|
||||
"""Gesture."""
|
||||
GESTURE_NONE = 0
|
||||
GESTURE_TAP = 1
|
||||
GESTURE_DOUBLETAP = 2
|
||||
|
@ -345,7 +325,6 @@ class Gesture(IntEnum):
|
|||
GESTURE_PINCH_OUT = 512
|
||||
|
||||
class CameraMode(IntEnum):
|
||||
"""Camera system modes."""
|
||||
CAMERA_CUSTOM = 0
|
||||
CAMERA_FREE = 1
|
||||
CAMERA_ORBITAL = 2
|
||||
|
@ -353,43 +332,36 @@ class CameraMode(IntEnum):
|
|||
CAMERA_THIRD_PERSON = 4
|
||||
|
||||
class CameraProjection(IntEnum):
|
||||
"""Camera projection."""
|
||||
CAMERA_PERSPECTIVE = 0
|
||||
CAMERA_ORTHOGRAPHIC = 1
|
||||
|
||||
class NPatchLayout(IntEnum):
|
||||
"""N-patch layout."""
|
||||
NPATCH_NINE_PATCH = 0
|
||||
NPATCH_THREE_PATCH_VERTICAL = 1
|
||||
NPATCH_THREE_PATCH_HORIZONTAL = 2
|
||||
|
||||
class GuiState(IntEnum):
|
||||
"""Gui control state."""
|
||||
STATE_NORMAL = 0
|
||||
STATE_FOCUSED = 1
|
||||
STATE_PRESSED = 2
|
||||
STATE_DISABLED = 3
|
||||
|
||||
class GuiTextAlignment(IntEnum):
|
||||
"""Gui control text alignment."""
|
||||
TEXT_ALIGN_LEFT = 0
|
||||
TEXT_ALIGN_CENTER = 1
|
||||
TEXT_ALIGN_RIGHT = 2
|
||||
|
||||
class GuiTextAlignmentVertical(IntEnum):
|
||||
"""Gui control text alignment vertical."""
|
||||
TEXT_ALIGN_TOP = 0
|
||||
TEXT_ALIGN_MIDDLE = 1
|
||||
TEXT_ALIGN_BOTTOM = 2
|
||||
|
||||
class GuiTextWrapMode(IntEnum):
|
||||
"""Gui control text wrap mode."""
|
||||
TEXT_WRAP_NONE = 0
|
||||
TEXT_WRAP_CHAR = 1
|
||||
TEXT_WRAP_WORD = 2
|
||||
|
||||
class GuiControl(IntEnum):
|
||||
"""Gui controls."""
|
||||
DEFAULT = 0
|
||||
LABEL = 1
|
||||
BUTTON = 2
|
||||
|
@ -408,7 +380,6 @@ class GuiControl(IntEnum):
|
|||
STATUSBAR = 15
|
||||
|
||||
class GuiControlProperty(IntEnum):
|
||||
"""Gui base properties for every control."""
|
||||
BORDER_COLOR_NORMAL = 0
|
||||
BASE_COLOR_NORMAL = 1
|
||||
TEXT_COLOR_NORMAL = 2
|
||||
|
@ -426,7 +397,6 @@ class GuiControlProperty(IntEnum):
|
|||
TEXT_ALIGNMENT = 14
|
||||
|
||||
class GuiDefaultProperty(IntEnum):
|
||||
"""DEFAULT extended properties."""
|
||||
TEXT_SIZE = 16
|
||||
TEXT_SPACING = 17
|
||||
LINE_COLOR = 18
|
||||
|
@ -436,20 +406,16 @@ class GuiDefaultProperty(IntEnum):
|
|||
TEXT_WRAP_MODE = 22
|
||||
|
||||
class GuiToggleProperty(IntEnum):
|
||||
"""Toggle/ToggleGroup."""
|
||||
GROUP_PADDING = 16
|
||||
|
||||
class GuiSliderProperty(IntEnum):
|
||||
"""Slider/SliderBar."""
|
||||
SLIDER_WIDTH = 16
|
||||
SLIDER_PADDING = 17
|
||||
|
||||
class GuiProgressBarProperty(IntEnum):
|
||||
"""ProgressBar."""
|
||||
PROGRESS_PADDING = 16
|
||||
|
||||
class GuiScrollBarProperty(IntEnum):
|
||||
"""ScrollBar."""
|
||||
ARROWS_SIZE = 16
|
||||
ARROWS_VISIBLE = 17
|
||||
SCROLL_SLIDER_PADDING = 18
|
||||
|
@ -458,40 +424,30 @@ class GuiScrollBarProperty(IntEnum):
|
|||
SCROLL_SPEED = 21
|
||||
|
||||
class GuiCheckBoxProperty(IntEnum):
|
||||
"""CheckBox."""
|
||||
CHECK_PADDING = 16
|
||||
|
||||
class GuiComboBoxProperty(IntEnum):
|
||||
"""ComboBox."""
|
||||
COMBO_BUTTON_WIDTH = 16
|
||||
COMBO_BUTTON_SPACING = 17
|
||||
|
||||
class GuiDropdownBoxProperty(IntEnum):
|
||||
"""DropdownBox."""
|
||||
ARROW_PADDING = 16
|
||||
DROPDOWN_ITEMS_SPACING = 17
|
||||
DROPDOWN_ARROW_HIDDEN = 18
|
||||
DROPDOWN_ROLL_UP = 19
|
||||
|
||||
class GuiTextBoxProperty(IntEnum):
|
||||
"""TextBox/TextBoxMulti/ValueBox/Spinner."""
|
||||
TEXT_READONLY = 16
|
||||
|
||||
class GuiSpinnerProperty(IntEnum):
|
||||
"""Spinner."""
|
||||
SPIN_BUTTON_WIDTH = 16
|
||||
SPIN_BUTTON_SPACING = 17
|
||||
|
||||
class GuiListViewProperty(IntEnum):
|
||||
"""ListView."""
|
||||
LIST_ITEMS_HEIGHT = 16
|
||||
LIST_ITEMS_SPACING = 17
|
||||
SCROLLBAR_WIDTH = 18
|
||||
SCROLLBAR_SIDE = 19
|
||||
LIST_ITEMS_BORDER_WIDTH = 20
|
||||
|
||||
class GuiColorPickerProperty(IntEnum):
|
||||
"""ColorPicker."""
|
||||
COLOR_SELECTOR_SIZE = 16
|
||||
HUEBAR_WIDTH = 17
|
||||
HUEBAR_PADDING = 18
|
||||
|
@ -499,7 +455,6 @@ class GuiColorPickerProperty(IntEnum):
|
|||
HUEBAR_SELECTOR_OVERFLOW = 20
|
||||
|
||||
class GuiIconName(IntEnum):
|
||||
"""."""
|
||||
ICON_NONE = 0
|
||||
ICON_FOLDER_FILE_OPEN = 1
|
||||
ICON_FILE_SAVE_CLASSIC = 2
|
||||
|
@ -720,15 +675,15 @@ class GuiIconName(IntEnum):
|
|||
ICON_FOLDER = 217
|
||||
ICON_FILE = 218
|
||||
ICON_SAND_TIMER = 219
|
||||
ICON_WARNING = 220
|
||||
ICON_HELP_BOX = 221
|
||||
ICON_INFO_BOX = 222
|
||||
ICON_PRIORITY = 223
|
||||
ICON_LAYERS_ISO = 224
|
||||
ICON_LAYERS2 = 225
|
||||
ICON_MLAYERS = 226
|
||||
ICON_MAPS = 227
|
||||
ICON_HOT = 228
|
||||
ICON_220 = 220
|
||||
ICON_221 = 221
|
||||
ICON_222 = 222
|
||||
ICON_223 = 223
|
||||
ICON_224 = 224
|
||||
ICON_225 = 225
|
||||
ICON_226 = 226
|
||||
ICON_227 = 227
|
||||
ICON_228 = 228
|
||||
ICON_229 = 229
|
||||
ICON_230 = 230
|
||||
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)
|
||||
|
||||
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():
|
||||
|
@ -36,6 +36,6 @@ while not pr.window_should_close():
|
|||
pr.end_drawing()
|
||||
|
||||
pos = pr.get_mouse_position()
|
||||
ray = pr.get_screen_to_world_ray(pos, camera)
|
||||
ray = pr.get_mouse_ray(pos, camera)
|
||||
|
||||
pr.close_window()
|
||||
|
|
|
@ -6,6 +6,26 @@ raylib [audio] example - playing
|
|||
import dataclasses
|
||||
import pyray
|
||||
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
|
||||
|
@ -13,11 +33,12 @@ MAX_CIRCLES=64
|
|||
|
||||
@dataclasses.dataclass
|
||||
class CircleWave:
|
||||
position: pyray.Vector2
|
||||
position: 'rl.Vector2'
|
||||
radius: float
|
||||
alpha: float
|
||||
speed: float
|
||||
color: pyray.Color
|
||||
color: 'rl.Color'
|
||||
|
||||
|
||||
screenWidth = 800
|
||||
screenHeight = 450
|
||||
|
@ -28,8 +49,8 @@ rl.InitWindow(screenWidth, screenHeight, b"raylib [audio] example - module playi
|
|||
|
||||
rl.InitAudioDevice() # Initialize audio device
|
||||
|
||||
colors = [pyray.ORANGE, pyray.RED, pyray.GOLD, pyray.LIME, pyray.BLUE, pyray.VIOLET, pyray.BROWN, pyray.LIGHTGRAY, pyray.PINK,
|
||||
pyray.YELLOW, pyray.GREEN, pyray.SKYBLUE, pyray.PURPLE, pyray.BEIGE]
|
||||
colors = [ ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK,
|
||||
YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE ]
|
||||
|
||||
# Creates some circles for visual effect
|
||||
circles = []
|
||||
|
@ -120,23 +141,23 @@ while not rl.WindowShouldClose(): # Detect window close button or ESC key
|
|||
#----------------------------------------------------------------------------------
|
||||
pyray.begin_drawing()
|
||||
|
||||
pyray.clear_background(pyray.RAYWHITE)
|
||||
pyray.clear_background(RAYWHITE)
|
||||
|
||||
for i in range(MAX_CIRCLES):
|
||||
pyray.draw_circle_v(circles[i].position, circles[i].radius, pyray.fade(circles[i].color, circles[i].alpha))
|
||||
pyray.draw_circle_v(circles[i].position, circles[i].radius, rl.Fade(circles[i].color, circles[i].alpha))
|
||||
|
||||
# Draw time bar
|
||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.LIGHTGRAY)
|
||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, pyray.MAROON)
|
||||
pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, pyray.GRAY)
|
||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY)
|
||||
pyray.draw_rectangle(20, screenHeight - 20 - 12, int(timePlayed), 12, MAROON)
|
||||
pyray.draw_rectangle_lines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY)
|
||||
|
||||
# Draw help instructions
|
||||
pyray.draw_rectangle(20, 20, 425, 145, pyray.RAYWHITE)
|
||||
pyray.draw_rectangle_lines(20, 20, 425, 145, pyray.GRAY)
|
||||
pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, pyray.BLACK)
|
||||
pyray.draw_text("PRESS P TO PAUSE/RESUME", 40, 70, 20, pyray.BLACK)
|
||||
pyray.draw_text("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, pyray.BLACK)
|
||||
pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, pyray.MAROON)
|
||||
pyray.draw_rectangle(20, 20, 425, 145, RAYWHITE)
|
||||
pyray.draw_rectangle_lines(20, 20, 425, 145, GRAY)
|
||||
pyray.draw_text("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, 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, BLACK)
|
||||
pyray.draw_text(f"SPEED: {pitch}", 40, 130, 20, MAROON)
|
||||
|
||||
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
|
||||
|
||||
# Player movement
|
||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT):
|
||||
if pyray.is_key_down(pyray.KEY_RIGHT):
|
||||
player.x += 2
|
||||
elif pyray.is_key_down(pyray.KeyboardKey.KEY_LEFT):
|
||||
elif pyray.is_key_down(pyray.KEY_LEFT):
|
||||
player.x -= 2
|
||||
|
||||
# Camera target follows player
|
||||
camera.target = pyray.Vector2(player.x + 20, player.y + 20)
|
||||
|
||||
# Camera rotation controls
|
||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_A):
|
||||
if pyray.is_key_down(pyray.KEY_A):
|
||||
camera.rotation -= 1
|
||||
elif pyray.is_key_down(pyray.KeyboardKey.KEY_S):
|
||||
elif pyray.is_key_down(pyray.KEY_S):
|
||||
camera.rotation += 1
|
||||
|
||||
# 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 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.rotation = 0.0
|
||||
|
||||
|
|
|
@ -13,14 +13,15 @@ pyray.set_target_fps(60)
|
|||
|
||||
camera = pyray.Camera2D()
|
||||
|
||||
camera = pyray.Camera2D()
|
||||
camera.zoom = 1.0
|
||||
|
||||
pyray.set_target_fps(60)
|
||||
pyray.set_target_fps(60);
|
||||
|
||||
# main game loop
|
||||
while not pyray.window_should_close():
|
||||
# update
|
||||
if pyray.is_mouse_button_down(pyray.MouseButton.MOUSE_BUTTON_RIGHT):
|
||||
if pyray.is_mouse_button_down(pyray.MOUSE_BUTTON_RIGHT):
|
||||
delta = pyray.get_mouse_delta()
|
||||
delta = pyray.vector2_scale(delta, -1.0 / camera.zoom)
|
||||
camera.target = pyray.vector2_add(camera.target, delta)
|
||||
|
@ -57,7 +58,7 @@ while not pyray.window_should_close():
|
|||
|
||||
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()
|
||||
|
||||
|
|
|
@ -62,11 +62,11 @@ class EnvItem:
|
|||
|
||||
|
||||
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
|
||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT):
|
||||
if pyray.is_key_down(pyray.KEY_RIGHT):
|
||||
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.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:
|
||||
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
|
||||
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
|
||||
|
||||
# Call update camera function by its pointer
|
||||
|
|
|
@ -10,7 +10,7 @@ MAX_COLUMNS = 20
|
|||
SCREEN_WIDTH = 800
|
||||
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)
|
||||
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.up = pyray.Vector3(0.0, 1.0, 0.0)
|
||||
camera.fovy = 60.0
|
||||
camera.projection = pyray.CameraProjection.CAMERA_PERSPECTIVE
|
||||
camera.projection = pyray.CAMERA_PERSPECTIVE
|
||||
|
||||
# Generates some random columns
|
||||
heights = []
|
||||
positions = []
|
||||
colors = []
|
||||
heights = [None] * MAX_COLUMNS
|
||||
positions = [None] * MAX_COLUMNS
|
||||
colors = [None] * MAX_COLUMNS
|
||||
|
||||
for i in range(MAX_COLUMNS):
|
||||
heights.append(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))
|
||||
colors.append(pyray.Color(pyray.get_random_value(20, 255), pyray.get_random_value(10, 55), 30, 255))
|
||||
heights[i] = pyray.get_random_value(1, 12) * 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[i] = pyray.Color(pyray.get_random_value(20, 255), pyray.get_random_value(10, 55), 30, 255)
|
||||
|
||||
|
||||
pyray.set_target_fps(60)
|
||||
|
||||
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()
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ while not window_should_close(): # Detect window close button or ESC key
|
|||
# Update
|
||||
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)
|
||||
|
||||
# Draw
|
||||
|
|
|
@ -40,7 +40,7 @@ while not pyray.window_should_close():
|
|||
|
||||
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)
|
||||
|
||||
|
|
|
@ -27,13 +27,13 @@ def main():
|
|||
if frame_count > 120:
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
begin_drawing()
|
||||
|
|
|
@ -11,6 +11,12 @@
|
|||
|
||||
"""
|
||||
import pyray
|
||||
from raylib.colors import (
|
||||
RAYWHITE,
|
||||
DARKGRAY,
|
||||
LIGHTGRAY,
|
||||
GRAY
|
||||
)
|
||||
|
||||
screenWidth = 800
|
||||
screenHeight = 450
|
||||
|
@ -30,21 +36,21 @@ while not pyray.window_should_close():
|
|||
|
||||
pyray.begin_drawing()
|
||||
|
||||
pyray.clear_background(pyray.RAYWHITE)
|
||||
pyray.clear_background(RAYWHITE)
|
||||
|
||||
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:
|
||||
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):
|
||||
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:
|
||||
pyray.draw_rectangle(0, 85 + 40*i, screenWidth, 40, pyray.fade(pyray.LIGHTGRAY, 0.3))
|
||||
pyray.draw_text(droppedFiles.paths[i], 120, 100 + 40*i, 10, pyray.GRAY)
|
||||
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, 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()
|
||||
|
||||
# De-Initialization
|
||||
|
|
|
@ -4,6 +4,13 @@ raylib [core] example - Input Gestures Detection
|
|||
|
||||
"""
|
||||
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 = []
|
||||
|
||||
current_gesture = pyray.Gesture.GESTURE_NONE
|
||||
last_gesture = pyray.Gesture.GESTURE_NONE
|
||||
current_gesture = pyray.GESTURE_NONE
|
||||
last_gesture = pyray.GESTURE_NONE
|
||||
|
||||
GESTURE_LABELS = {
|
||||
pyray.Gesture.GESTURE_TAP: 'GESTURE TAP',
|
||||
pyray.Gesture.GESTURE_DOUBLETAP: 'GESTURE DOUBLETAP',
|
||||
pyray.Gesture.GESTURE_HOLD: 'GESTURE HOLD',
|
||||
pyray.Gesture.GESTURE_DRAG: 'GESTURE DRAG',
|
||||
pyray.Gesture.GESTURE_SWIPE_RIGHT: 'GESTURE SWIPE RIGHT',
|
||||
pyray.Gesture.GESTURE_SWIPE_LEFT: 'GESTURE SWIPE LEFT',
|
||||
pyray.Gesture.GESTURE_SWIPE_UP: 'GESTURE SWIPE UP',
|
||||
pyray.Gesture.GESTURE_SWIPE_DOWN: 'GESTURE SWIPE DOWN',
|
||||
pyray.Gesture.GESTURE_PINCH_IN: 'GESTURE PINCH IN',
|
||||
pyray.Gesture.GESTURE_PINCH_OUT: 'GESTURE PINCH OUT',
|
||||
pyray.GESTURE_TAP: 'GESTURE TAP',
|
||||
pyray.GESTURE_DOUBLETAP: 'GESTURE DOUBLETAP',
|
||||
pyray.GESTURE_HOLD: 'GESTURE HOLD',
|
||||
pyray.GESTURE_DRAG: 'GESTURE DRAG',
|
||||
pyray.GESTURE_SWIPE_RIGHT: 'GESTURE SWIPE RIGHT',
|
||||
pyray.GESTURE_SWIPE_LEFT: 'GESTURE SWIPE LEFT',
|
||||
pyray.GESTURE_SWIPE_UP: 'GESTURE SWIPE UP',
|
||||
pyray.GESTURE_SWIPE_DOWN: 'GESTURE SWIPE DOWN',
|
||||
pyray.GESTURE_PINCH_IN: 'GESTURE PINCH IN',
|
||||
pyray.GESTURE_PINCH_OUT: 'GESTURE PINCH OUT',
|
||||
}
|
||||
|
||||
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 (
|
||||
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:
|
||||
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
|
||||
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.RAYWHITE)
|
||||
RAYWHITE)
|
||||
pyray.draw_text(
|
||||
'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):
|
||||
if i % 2 == 0:
|
||||
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:
|
||||
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:
|
||||
pyray.draw_text(val, 35, 36 + 20 * i, 10, pyray.DARKGRAY)
|
||||
pyray.draw_text(val, 35, 36 + 20 * i, 10, DARKGRAY)
|
||||
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_text('DETECTED GESTURES', 50, 15, 10, pyray.GRAY)
|
||||
pyray.draw_rectangle_lines(10, 29, 200, SCREEN_HEIGHT - 50, GRAY)
|
||||
pyray.draw_text('DETECTED GESTURES', 50, 15, 10, GRAY)
|
||||
|
||||
if current_gesture != pyray.Gesture.GESTURE_NONE:
|
||||
pyray.draw_circle_v(touch_position, 30, pyray.MAROON)
|
||||
if current_gesture != pyray.GESTURE_NONE:
|
||||
pyray.draw_circle_v(touch_position, 30, MAROON)
|
||||
|
||||
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
|
||||
while not pyray.window_should_close(): # Detect window close button or ESC key
|
||||
# Update
|
||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_RIGHT):
|
||||
if pyray.is_key_down(pyray.KEY_RIGHT):
|
||||
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
|
||||
if pyray.is_key_down(pyray.KeyboardKey.KEY_UP):
|
||||
if pyray.is_key_down(pyray.KEY_UP):
|
||||
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
|
||||
|
||||
# Draw
|
||||
|
|
|
@ -22,19 +22,19 @@ while not window_should_close(): # Detect window close button or ESC key
|
|||
# Update
|
||||
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
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_MIDDLE):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_MIDDLE):
|
||||
ball_color = LIME
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_RIGHT):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
|
||||
ball_color = DARKBLUE
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_SIDE):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_SIDE):
|
||||
ball_color = PURPLE
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_EXTRA):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_EXTRA):
|
||||
ball_color = YELLOW
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_FORWARD):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_FORWARD):
|
||||
ball_color = ORANGE
|
||||
elif is_mouse_button_pressed(MouseButton.MOUSE_BUTTON_BACK):
|
||||
elif is_mouse_button_pressed(MOUSE_BUTTON_BACK):
|
||||
ball_color = BEIGE
|
||||
# Draw
|
||||
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
|
||||
# Update
|
||||
# ----------------------------------------------------------------------------------
|
||||
if is_key_pressed(KeyboardKey.KEY_S):
|
||||
if is_key_pressed(KEY_S):
|
||||
scissorMode = not scissorMode
|
||||
|
||||
# Centre the scissor area around the mouse position
|
||||
|
|
|
@ -18,7 +18,7 @@ worldSpaceCamera.zoom = 1.0
|
|||
screenSpaceCamera = Camera2D([0]) # Smoothing camera
|
||||
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)
|
||||
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
|
||||
|
||||
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
|
||||
cameraX = (math.sin(get_time())*50.0) - 10.0
|
||||
|
|
|
@ -66,21 +66,21 @@ while not window_should_close(): # Detect window close button or ESC key
|
|||
|
||||
# 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.target.z += offsetThisFrame
|
||||
|
||||
elif is_key_down(KeyboardKey.KEY_S):
|
||||
elif is_key_down(KEY_S):
|
||||
|
||||
cameraPlayer1.position.z -= offsetThisFrame
|
||||
cameraPlayer1.target.z -= offsetThisFrame
|
||||
|
||||
# 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.target.x += offsetThisFrame
|
||||
|
||||
elif is_key_down(KeyboardKey.KEY_DOWN):
|
||||
elif is_key_down(KEY_DOWN):
|
||||
cameraPlayer2.position
|
||||
cameraPlayer2.position.x -= offsetThisFrame
|
||||
cameraPlayer2.target.x -= offsetThisFrame
|
||||
|
|
|
@ -17,6 +17,7 @@ device = pyray.VrDeviceInfo(
|
|||
1200, # Vertical resolution in pixels
|
||||
0.133793, # Horizontal 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.07, # Lens separation distance in meters
|
||||
0.07, # IPD (distance between pupils) in meters
|
||||
|
@ -34,15 +35,15 @@ config = pyray.load_vr_stereo_config(device)
|
|||
distortion = pyray.load_shader(pyray.ffi.NULL, f"resources/distortion{GLSL_VERSION}.fs")
|
||||
|
||||
# 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,pyray.ffi.new('char []', b"rightLensCenter"), pyray.ShaderUniformDataType.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,pyray.ffi.new('char []', b"rightScreenCenter"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 2, pyray.ffi.new('char []', b"leftLensCenter"), pyray.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"rightLensCenter"), pyray.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"leftScreenCenter"), pyray.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"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,pyray.ffi.new('char []', b"scaleIn"), pyray.ShaderUniformDataType.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,pyray.ffi.new('char []', b"chromaAbParam"), pyray.ShaderUniformDataType.SHADER_UNIFORM_VEC4)
|
||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"scale"), pyray.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 2,pyray.ffi.new('char []', b"scaleIn"), pyray.SHADER_UNIFORM_VEC2)
|
||||
pyray.set_shader_value(distortion, 4,pyray.ffi.new('char []', b"deviceWarpParam"), pyray.SHADER_UNIFORM_VEC4)
|
||||
pyray.set_shader_value(distortion, 4,pyray.ffi.new('char []', b"chromaAbParam"), pyray.SHADER_UNIFORM_VEC4)
|
||||
|
||||
# Initialize framebuffer for stereo rendering
|
||||
# NOTE: Screen size should match HMD aspect ratio
|
||||
|
@ -58,7 +59,7 @@ camera = pyray.Camera3D(
|
|||
pyray.Vector3(0.0, 2.0, 0.0), # Camera looking at point
|
||||
pyray.Vector3(0.0, 1.0, 0.0), # Camera up vector
|
||||
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)
|
||||
|
@ -70,7 +71,7 @@ pyray.set_target_fps(90) # Set our game to run at 90 frames-per-sec
|
|||
# Main game loop
|
||||
while not pyray.window_should_close(): # Detect window close button or ESC key
|
||||
# Update
|
||||
pyray.update_camera(camera, pyray.CameraMode.CAMERA_FIRST_PERSON)
|
||||
pyray.update_camera(camera, pyray.CAMERA_FIRST_PERSON)
|
||||
|
||||
# Draw
|
||||
pyray.begin_texture_mode(target)
|
||||
|
|
|
@ -6,7 +6,7 @@ import pyray
|
|||
screen_width = 800
|
||||
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_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
|
||||
# Update
|
||||
# -----------------------------------------------------
|
||||
if is_key_pressed(pyray.KeyboardKey.KEY_F):
|
||||
if is_key_pressed(pyray.KEY_F):
|
||||
toggle_fullscreen()
|
||||
|
||||
if is_key_pressed(pyray.KeyboardKey.KEY_R):
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE)
|
||||
if is_key_pressed(pyray.KEY_R):
|
||||
if is_window_state(pyray.FLAG_WINDOW_RESIZABLE):
|
||||
clear_window_state(pyray.FLAG_WINDOW_RESIZABLE)
|
||||
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_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED)
|
||||
if is_key_pressed(pyray.KEY_D):
|
||||
if is_window_state(pyray.FLAG_WINDOW_UNDECORATED):
|
||||
clear_window_state(pyray.FLAG_WINDOW_UNDECORATED)
|
||||
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 not is_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN):
|
||||
set_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN)
|
||||
if is_key_pressed(pyray.KEY_H):
|
||||
if not is_window_state(pyray.FLAG_WINDOW_HIDDEN):
|
||||
set_window_state(pyray.FLAG_WINDOW_HIDDEN)
|
||||
frames_counter = 0
|
||||
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_HIDDEN):
|
||||
if is_window_state(pyray.FLAG_WINDOW_HIDDEN):
|
||||
frames_counter += 1
|
||||
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 not is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED):
|
||||
if is_key_pressed(pyray.KEY_N):
|
||||
if not is_window_state(pyray.FLAG_WINDOW_MINIMIZED):
|
||||
minimize_window()
|
||||
frames_counter = 0
|
||||
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED):
|
||||
if is_window_state(pyray.FLAG_WINDOW_MINIMIZED):
|
||||
frames_counter += 1
|
||||
if frames_counter >= 240:
|
||||
restore_window() # Restore window after 3 seconds
|
||||
|
||||
if is_key_pressed(pyray.KeyboardKey.KEY_M):
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE):
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_MAXIMIZED):
|
||||
if is_key_pressed(pyray.KEY_M):
|
||||
if is_window_state(pyray.FLAG_WINDOW_RESIZABLE):
|
||||
if is_window_state(pyray.FLAG_WINDOW_MAXIMIZED):
|
||||
restore_window()
|
||||
else:
|
||||
maximize_window()
|
||||
|
||||
if is_key_pressed(pyray.KeyboardKey.KEY_U):
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED)
|
||||
if is_key_pressed(pyray.KEY_U):
|
||||
if is_window_state(pyray.FLAG_WINDOW_UNFOCUSED):
|
||||
clear_window_state(pyray.FLAG_WINDOW_UNFOCUSED)
|
||||
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_window_state(pyray.ConfigFlags.FLAG_WINDOW_TOPMOST):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_TOPMOST)
|
||||
if is_key_pressed(pyray.KEY_T):
|
||||
if is_window_state(pyray.FLAG_WINDOW_TOPMOST):
|
||||
clear_window_state(pyray.FLAG_WINDOW_TOPMOST)
|
||||
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_window_state(pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN)
|
||||
if is_key_pressed(pyray.KEY_A):
|
||||
if is_window_state(pyray.FLAG_WINDOW_ALWAYS_RUN):
|
||||
clear_window_state(pyray.FLAG_WINDOW_ALWAYS_RUN)
|
||||
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_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT):
|
||||
clear_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT)
|
||||
if is_key_pressed(pyray.KEY_V):
|
||||
if is_window_state(pyray.FLAG_VSYNC_HINT):
|
||||
clear_window_state(pyray.FLAG_VSYNC_HINT)
|
||||
else:
|
||||
set_window_state(pyray.ConfigFlags.FLAG_VSYNC_HINT)
|
||||
set_window_state(pyray.FLAG_VSYNC_HINT)
|
||||
|
||||
# Bouncing ball logic
|
||||
ball_position.x += ball_speed.x
|
||||
|
@ -96,7 +96,7 @@ while not window_should_close(): # Detect window close button or ESC key
|
|||
# -----------------------------------------------------
|
||||
begin_drawing()
|
||||
|
||||
if is_window_state(pyray.ConfigFlags.FLAG_WINDOW_TRANSPARENT):
|
||||
if is_window_state(pyray.FLAG_WINDOW_TRANSPARENT):
|
||||
clear_background(BLANK)
|
||||
else:
|
||||
clear_background(RAYWHITE)
|
||||
|
@ -113,16 +113,16 @@ while not window_should_close(): # Detect window close button or ESC key
|
|||
# Draw window state info
|
||||
draw_text("Following flags can be set after window creation:", 10, 60, 10, GRAY)
|
||||
flag_texts = [
|
||||
("FLAG_FULLSCREEN_MODE", pyray.ConfigFlags.FLAG_FULLSCREEN_MODE),
|
||||
("FLAG_WINDOW_RESIZABLE", pyray.ConfigFlags.FLAG_WINDOW_RESIZABLE),
|
||||
("FLAG_WINDOW_UNDECORATED", pyray.ConfigFlags.FLAG_WINDOW_UNDECORATED),
|
||||
("FLAG_WINDOW_HIDDEN", pyray.ConfigFlags.FLAG_WINDOW_HIDDEN),
|
||||
("FLAG_WINDOW_MINIMIZED", pyray.ConfigFlags.FLAG_WINDOW_MINIMIZED),
|
||||
("FLAG_WINDOW_MAXIMIZED", pyray.ConfigFlags.FLAG_WINDOW_MAXIMIZED),
|
||||
("FLAG_WINDOW_UNFOCUSED", pyray.ConfigFlags.FLAG_WINDOW_UNFOCUSED),
|
||||
("FLAG_WINDOW_TOPMOST", pyray.ConfigFlags.FLAG_WINDOW_TOPMOST),
|
||||
("FLAG_WINDOW_ALWAYS_RUN", pyray.ConfigFlags.FLAG_WINDOW_ALWAYS_RUN),
|
||||
("FLAG_VSYNC_HINT", pyray.ConfigFlags.FLAG_VSYNC_HINT),
|
||||
("FLAG_FULLSCREEN_MODE", pyray.FLAG_FULLSCREEN_MODE),
|
||||
("FLAG_WINDOW_RESIZABLE", pyray.FLAG_WINDOW_RESIZABLE),
|
||||
("FLAG_WINDOW_UNDECORATED", pyray.FLAG_WINDOW_UNDECORATED),
|
||||
("FLAG_WINDOW_HIDDEN", pyray.FLAG_WINDOW_HIDDEN),
|
||||
("FLAG_WINDOW_MINIMIZED", pyray.FLAG_WINDOW_MINIMIZED),
|
||||
("FLAG_WINDOW_MAXIMIZED", pyray.FLAG_WINDOW_MAXIMIZED),
|
||||
("FLAG_WINDOW_UNFOCUSED", pyray.FLAG_WINDOW_UNFOCUSED),
|
||||
("FLAG_WINDOW_TOPMOST", pyray.FLAG_WINDOW_TOPMOST),
|
||||
("FLAG_WINDOW_ALWAYS_RUN", pyray.FLAG_WINDOW_ALWAYS_RUN),
|
||||
("FLAG_VSYNC_HINT", pyray.FLAG_VSYNC_HINT),
|
||||
]
|
||||
y_offset = 80
|
||||
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
|
||||
|
||||
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)
|
||||
else:
|
||||
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)
|
||||
else:
|
||||
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)
|
||||
else:
|
||||
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")
|
||||
|
||||
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
|
||||
exitWindow = False # Flag to set window to exit
|
||||
|
@ -26,7 +26,7 @@ while not exitWindow:
|
|||
# Update
|
||||
# ----------------------------------------------------------------------------------
|
||||
# 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
|
||||
|
||||
if exitWindowRequested:
|
||||
|
@ -34,9 +34,9 @@ while not exitWindow:
|
|||
# A request for close window has been issued, we can save data before closing
|
||||
# or just show a message asking for confirmation
|
||||
|
||||
if is_key_pressed(KeyboardKey.KEY_Y):
|
||||
if is_key_pressed(KEY_Y):
|
||||
exitWindow = True
|
||||
elif is_key_pressed(KeyboardKey.KEY_N):
|
||||
elif is_key_pressed(KEY_N):
|
||||
exitWindowRequested = False
|
||||
|
||||
# ----------------------------------------------------------------------------------
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue