Compare commits
2 commits
master
...
env-vars-f
Author | SHA1 | Date | |
---|---|---|---|
|
c1e3fa2eca | ||
|
f6b6942292 |
23 changed files with 96 additions and 478 deletions
4
.gitmodules
vendored
4
.gitmodules
vendored
|
@ -1,9 +1,9 @@
|
||||||
[submodule "raylib-c"]
|
[submodule "raylib-c"]
|
||||||
path = raylib-c
|
path = raylib-c
|
||||||
url = https://git.terah.dev/UnrealXR/raylib.git
|
url = https://github.com/raysan5/raylib.git
|
||||||
[submodule "raygui"]
|
[submodule "raygui"]
|
||||||
path = raygui
|
path = raygui
|
||||||
url = https://github.com/raysan5/raygui.git
|
url = https://github.com/raysan5/raygui.git
|
||||||
[submodule "physac"]
|
[submodule "physac"]
|
||||||
path = physac
|
path = physac
|
||||||
url = https://github.com/victorfisac/Physac.git
|
url = https://github.com/victorfisac/Physac
|
||||||
|
|
|
@ -83,6 +83,11 @@ To build a binary wheel distribution:
|
||||||
pip3 install wheel
|
pip3 install wheel
|
||||||
python setup.py bdist_wheel
|
python setup.py bdist_wheel
|
||||||
|
|
||||||
|
.. TODO::
|
||||||
|
There's a hardcoded path (to the raylib header files) in `raylib/build.py` you will probably need to edit.
|
||||||
|
Would be useful if some Windows user could figure out how to auto detect this.
|
||||||
|
|
||||||
|
|
||||||
Then install it:
|
Then install it:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
|
@ -35,4 +35,3 @@ print("""from enum import IntEnum
|
||||||
process("raylib.json")
|
process("raylib.json")
|
||||||
process("raygui.json")
|
process("raygui.json")
|
||||||
process("glfw3.json")
|
process("glfw3.json")
|
||||||
process("physac.json")
|
|
||||||
|
|
|
@ -83,7 +83,6 @@ from warnings import deprecated
|
||||||
import _cffi_backend # type: ignore
|
import _cffi_backend # type: ignore
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
PhysicsShapeType = int
|
|
||||||
""")
|
""")
|
||||||
|
|
||||||
# These words can be used for c arg names, but not in python
|
# These words can be used for c arg names, but not in python
|
||||||
|
|
|
@ -74,7 +74,6 @@ import _cffi_backend # type: ignore
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
rl: _cffi_backend.Lib
|
rl: _cffi_backend.Lib
|
||||||
PhysicsShapeType = int
|
|
||||||
|
|
||||||
class struct: ...
|
class struct: ...
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,9 @@ import itertools
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
import platform
|
import platform
|
||||||
import logging
|
|
||||||
from .version import __version__
|
from .version import __version__
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
MODULE = pathlib.Path(__file__).parent
|
MODULE = pathlib.Path(__file__).parent
|
||||||
|
|
||||||
def raylib_library_path():
|
def raylib_library_path():
|
||||||
|
@ -55,9 +54,9 @@ ffi.cdef(open(MODULE / "raylib_modified.h").read().replace('RLAPI ', ''))
|
||||||
try:
|
try:
|
||||||
raylib_fname = raylib_library_path()
|
raylib_fname = raylib_library_path()
|
||||||
rl = ffi.dlopen(raylib_fname)
|
rl = ffi.dlopen(raylib_fname)
|
||||||
logger.warning('LOADED DYNAMICALLY SHARED LIB {} {}'.format(__version__, raylib_fname))
|
print('LOADED DYNAMICALLY SHARED LIB {} {}'.format(__version__, raylib_fname))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(e)
|
print(e)
|
||||||
|
|
||||||
LIGHTGRAY =( 200, 200, 200, 255 )
|
LIGHTGRAY =( 200, 200, 200, 255 )
|
||||||
GRAY =( 130, 130, 130, 255 )
|
GRAY =( 130, 130, 130, 255 )
|
||||||
|
|
|
@ -4,7 +4,6 @@ import _cffi_backend # type: ignore
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
rl: _cffi_backend.Lib
|
rl: _cffi_backend.Lib
|
||||||
PhysicsShapeType = int
|
|
||||||
|
|
||||||
class struct: ...
|
class struct: ...
|
||||||
|
|
||||||
|
|
|
@ -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.
|
@ -126,7 +126,7 @@ def _make_struct_constructor_function(struct):
|
||||||
or isinstance(arg, (array, bytes, bytearray, memoryview)))):
|
or isinstance(arg, (array, bytes, bytearray, memoryview)))):
|
||||||
arg = ffi.from_buffer(field[1].type, arg)
|
arg = ffi.from_buffer(field[1].type, arg)
|
||||||
modified_args.append(arg)
|
modified_args.append(arg)
|
||||||
s = ffi.new(f"{struct} *", modified_args)[0]
|
s = ffi.new(f"struct {struct} *", modified_args)[0]
|
||||||
global_weakkeydict[s] = modified_args
|
global_weakkeydict[s] = modified_args
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
|
@ -908,7 +908,6 @@ from warnings import deprecated
|
||||||
import _cffi_backend # type: ignore
|
import _cffi_backend # type: ignore
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
PhysicsShapeType = int
|
|
||||||
|
|
||||||
def attach_audio_mixed_processor(processor: Any,) -> None:
|
def attach_audio_mixed_processor(processor: Any,) -> None:
|
||||||
"""Attach audio stream processor to the entire audio pipeline, receives the samples as 'float'."""
|
"""Attach audio stream processor to the entire audio pipeline, receives the samples as 'float'."""
|
||||||
|
|
2
raylib-c
2
raylib-c
|
@ -1 +1 @@
|
||||||
Subproject commit 15afe89aff2fc7da96ab5de80bde7f6186971cde
|
Subproject commit 26548c10620c4ae6937cf8b506c777a006b33c16
|
|
@ -13,22 +13,18 @@
|
||||||
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import logging
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ._raylib_cffi import ffi, lib as rl
|
from ._raylib_cffi import ffi, lib as rl
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
logger.error("*** ERROR LOADING NATIVE CODE ***")
|
print("\n*** ERROR LOADING NATIVE CODE ***\n")
|
||||||
logger.error("See https://github.com/electronstudio/raylib-python-cffi/issues/142")
|
print("See https://github.com/electronstudio/raylib-python-cffi/issues/142\n", file=sys.stderr)
|
||||||
logger.error("Your Python is: %s", str(sys.implementation))
|
print("Your Python is: "+str(sys.implementation)+"\n", file=sys.stderr)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
from raylib._raylib_cffi.lib import *
|
from raylib._raylib_cffi.lib import *
|
||||||
from raylib.colors import *
|
from raylib.colors import *
|
||||||
from raylib.defines import *
|
from raylib.defines import *
|
||||||
import cffi
|
import cffi
|
||||||
from .version import __version__
|
from .version import __version__
|
||||||
|
|
||||||
logger.warning("RAYLIB STATIC %s LOADED", __version__)
|
print("RAYLIB STATIC "+__version__+" LOADED", file=sys.stderr)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ import _cffi_backend # type: ignore
|
||||||
|
|
||||||
ffi: _cffi_backend.FFI
|
ffi: _cffi_backend.FFI
|
||||||
rl: _cffi_backend.Lib
|
rl: _cffi_backend.Lib
|
||||||
PhysicsShapeType = int
|
|
||||||
|
|
||||||
class struct: ...
|
class struct: ...
|
||||||
|
|
||||||
|
|
134
raylib/build.py
134
raylib/build.py
|
@ -15,53 +15,50 @@
|
||||||
# Assumes raylib, GL, etc are all already installed as system libraries. We dont distribute them.
|
# Assumes raylib, GL, etc are all already installed as system libraries. We dont distribute them.
|
||||||
# Raylib must be installed and compiled with: cmake -DWITH_PIC=ON -DSHARED=ON -DSTATIC=ON ..
|
# Raylib must be installed and compiled with: cmake -DWITH_PIC=ON -DSHARED=ON -DSTATIC=ON ..
|
||||||
|
|
||||||
# We use /usr/local/lib/libraylib.a to ensure we link to static version
|
|
||||||
import re
|
|
||||||
|
|
||||||
|
import re
|
||||||
from cffi import FFI
|
from cffi import FFI
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import sys
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
THIS_DIR = Path(__file__).resolve().parent
|
|
||||||
REPO_ROOT = THIS_DIR.parent
|
|
||||||
|
|
||||||
|
# Environment variables you can set before build
|
||||||
|
#
|
||||||
|
# RAYLIB_PLATFORM: Any one of: Desktop, SDL, DRM, PLATFORM_COMMA
|
||||||
|
# RAYLIB_LINK_ARGS: Arguments to pass to the linker rather than getting them from pkg-config.
|
||||||
|
# e.g.: -L/usr/local/lib -lraylib
|
||||||
|
# RAYLIB_INCLUDE_PATH: Directory to find raylib.h rather than getting from pkg-config.
|
||||||
|
# e.g.: /usr/local/include
|
||||||
|
# RAYGUI_INCLUDE_PATH: Directory to find raygui.h
|
||||||
|
# e.g.: /usr/local/include
|
||||||
|
# GLFW_INCLUDE_PATH: Directory to find glfw3.h
|
||||||
|
# e.g.: /usr/local/include/GLFW
|
||||||
|
# PHYSAC_INCLUDE_PATH: Directory to find physac.h
|
||||||
|
# e.g.: /usr/local/include
|
||||||
|
# LIBFFI_INCLUDE_PATH:
|
||||||
|
# e.g.: /usr/local/include
|
||||||
|
|
||||||
RAYLIB_PLATFORM = os.getenv("RAYLIB_PLATFORM", "Desktop")
|
RAYLIB_PLATFORM = os.getenv("RAYLIB_PLATFORM", "Desktop")
|
||||||
ENABLE_WAYLAND_DRM_LEASING = os.getenv("ENABLE_WAYLAND_DRM_LEASING")
|
|
||||||
|
|
||||||
def check_raylib_installed():
|
def check_raylib_pkgconfig_installed():
|
||||||
return subprocess.run(['pkg-config', '--exists', 'raylib'], text=True, stdout=subprocess.PIPE).returncode == 0
|
return subprocess.run(['pkg-config', '--exists', 'raylib'], text=True, stdout=subprocess.PIPE).returncode == 0
|
||||||
|
|
||||||
def check_SDL_installed():
|
def check_sdl_pkgconfig_installed():
|
||||||
return subprocess.run(['pkg-config', '--exists', 'sdl2'], text=True, stdout=subprocess.PIPE).returncode == 0
|
return subprocess.run(['pkg-config', '--exists', 'sdl2'], text=True, stdout=subprocess.PIPE).returncode == 0
|
||||||
|
|
||||||
def get_the_include_path():
|
def get_the_include_path_from_pkgconfig():
|
||||||
return subprocess.run(['pkg-config', '--variable=includedir', 'raylib'], text=True,
|
return subprocess.run(['pkg-config', '--variable=includedir', 'raylib'], text=True,
|
||||||
stdout=subprocess.PIPE).stdout.strip()
|
stdout=subprocess.PIPE).stdout.strip()
|
||||||
|
|
||||||
|
|
||||||
def get_the_lib_path():
|
def get_the_lib_path_from_pkgconfig():
|
||||||
return subprocess.run(['pkg-config', '--variable=libdir', 'raylib'], text=True,
|
return subprocess.run(['pkg-config', '--variable=libdir', 'raylib'], text=True,
|
||||||
stdout=subprocess.PIPE).stdout.strip()
|
stdout=subprocess.PIPE).stdout.strip()
|
||||||
|
|
||||||
def get_specified_libs(lib_target):
|
def get_lib_flags_from_pkgconfig():
|
||||||
libs = subprocess.run(['pkg-config', '--libs', lib_target], text=True,
|
|
||||||
stdout=subprocess.PIPE).stdout.strip().split()
|
|
||||||
|
|
||||||
if libs == "":
|
|
||||||
raise ValueError(f"Failed to get specified libs ({lib_target})")
|
|
||||||
|
|
||||||
print(f"{lib_target}: {libs}")
|
|
||||||
|
|
||||||
return libs
|
|
||||||
|
|
||||||
def get_lib_flags():
|
|
||||||
return subprocess.run(['pkg-config', '--libs', 'raylib'], text=True,
|
return subprocess.run(['pkg-config', '--libs', 'raylib'], text=True,
|
||||||
stdout=subprocess.PIPE).stdout.strip().split()
|
stdout=subprocess.PIPE).stdout.strip()
|
||||||
|
|
||||||
def pre_process_header(filename, remove_function_bodies=False):
|
def pre_process_header(filename, remove_function_bodies=False):
|
||||||
print("Pre-processing " + filename)
|
print("Pre-processing " + filename)
|
||||||
|
@ -121,24 +118,29 @@ def check_header_exists(file):
|
||||||
|
|
||||||
|
|
||||||
def build_unix():
|
def build_unix():
|
||||||
if not check_raylib_installed():
|
if os.getenv("RAYLIB_LINK_ARGS") is None and not check_raylib_pkgconfig_installed():
|
||||||
raise Exception("ERROR: raylib not found by pkg-config. Please install pkg-config and Raylib.")
|
raise Exception("ERROR: raylib not found by pkg-config. Please install pkg-config and Raylib"
|
||||||
|
"or else set RAYLIB_LINK_ARGS env variable.")
|
||||||
|
|
||||||
if RAYLIB_PLATFORM=="SDL" and not check_SDL_installed():
|
if RAYLIB_PLATFORM=="SDL" and os.getenv("RAYLIB_LINK_ARGS") is None and not check_sdl_pkgconfig_installed():
|
||||||
raise Exception("ERROR: SDL2 not found by pkg-config. Please install pkg-config and SDL2.")
|
raise Exception("ERROR: SDL2 not found by pkg-config. Please install pkg-config and SDL2."
|
||||||
|
"or else set RAYLIB_LINK_ARGS env variable.")
|
||||||
|
|
||||||
raylib_h = get_the_include_path() + "/raylib.h"
|
raylib_include_path = os.getenv("RAYLIB_INCLUDE_PATH")
|
||||||
rlgl_h = get_the_include_path() + "/rlgl.h"
|
if raylib_include_path is None:
|
||||||
raymath_h = get_the_include_path() + "/raymath.h"
|
raylib_include_path = get_the_include_path_from_pkgconfig()
|
||||||
|
raylib_h = raylib_include_path + "/raylib.h"
|
||||||
|
rlgl_h = raylib_include_path + "/rlgl.h"
|
||||||
|
raymath_h = raylib_include_path + "/raymath.h"
|
||||||
|
|
||||||
if not os.path.isfile(raylib_h):
|
if not os.path.isfile(raylib_h):
|
||||||
raise Exception("ERROR: " + raylib_h + " not found. Please install Raylib.")
|
raise Exception("ERROR: " + raylib_h + " not found. Please install Raylib or set RAYLIB_INCLUDE_PATH.")
|
||||||
|
|
||||||
if not os.path.isfile(rlgl_h):
|
if not os.path.isfile(rlgl_h):
|
||||||
raise Exception("ERROR: " + rlgl_h + " not found. Please install Raylib.")
|
raise Exception("ERROR: " + rlgl_h + " not found. Please install Raylib or set RAYLIB_INCLUDE_PATH.")
|
||||||
|
|
||||||
if not os.path.isfile(raymath_h):
|
if not os.path.isfile(raymath_h):
|
||||||
raise Exception("ERROR: " + raylib_h + " not found. Please install Raylib.")
|
raise Exception("ERROR: " + raylib_h + " not found. Please install Raylib or set RAYLIB_INCLUDE_PATH.")
|
||||||
|
|
||||||
ffi_includes = """
|
ffi_includes = """
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
@ -146,13 +148,19 @@ def build_unix():
|
||||||
#include "raymath.h"
|
#include "raymath.h"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
glfw3_h = get_the_include_path() + "/GLFW/glfw3.h"
|
glfw_include_path = os.getenv("GLFW_INCLUDE_PATH")
|
||||||
|
if glfw_include_path is None:
|
||||||
|
glfw_include_path = get_the_include_path_from_pkgconfig()
|
||||||
|
glfw3_h = glfw_include_path + "/GLFW/glfw3.h"
|
||||||
if RAYLIB_PLATFORM=="Desktop" and check_header_exists(glfw3_h):
|
if RAYLIB_PLATFORM=="Desktop" and check_header_exists(glfw3_h):
|
||||||
ffi_includes += """
|
ffi_includes += """
|
||||||
#include "GLFW/glfw3.h"
|
#include "GLFW/glfw3.h"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
raygui_h = get_the_include_path() + "/raygui.h"
|
raygui_include_path = os.getenv("RAYGUI_INCLUDE_PATH")
|
||||||
|
if raygui_include_path is None:
|
||||||
|
raygui_include_path = get_the_include_path_from_pkgconfig()
|
||||||
|
raygui_h = raygui_include_path + "/raygui.h"
|
||||||
if check_header_exists(raygui_h):
|
if check_header_exists(raygui_h):
|
||||||
ffi_includes += """
|
ffi_includes += """
|
||||||
#define RAYGUI_IMPLEMENTATION
|
#define RAYGUI_IMPLEMENTATION
|
||||||
|
@ -160,13 +168,20 @@ def build_unix():
|
||||||
#include "raygui.h"
|
#include "raygui.h"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
physac_h = get_the_include_path() + "/physac.h"
|
physac_include_path = os.getenv("PHYSAC_INCLUDE_PATH")
|
||||||
|
if physac_include_path is None:
|
||||||
|
physac_include_path = get_the_include_path_from_pkgconfig()
|
||||||
|
physac_h = physac_include_path + "/physac.h"
|
||||||
if check_header_exists(physac_h):
|
if check_header_exists(physac_h):
|
||||||
ffi_includes += """
|
ffi_includes += """
|
||||||
#define PHYSAC_IMPLEMENTATION
|
#define PHYSAC_IMPLEMENTATION
|
||||||
#include "physac.h"
|
#include "physac.h"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
libffi_include_path = os.getenv("LIBFFI_INCLUDE_PATH")
|
||||||
|
if libffi_include_path is None:
|
||||||
|
libffi_include_path = get_the_include_path_from_pkgconfig()
|
||||||
|
|
||||||
ffibuilder.cdef(pre_process_header(raylib_h))
|
ffibuilder.cdef(pre_process_header(raylib_h))
|
||||||
ffibuilder.cdef(pre_process_header(rlgl_h))
|
ffibuilder.cdef(pre_process_header(rlgl_h))
|
||||||
ffibuilder.cdef(pre_process_header(raymath_h, True))
|
ffibuilder.cdef(pre_process_header(raymath_h, True))
|
||||||
|
@ -181,7 +196,11 @@ def build_unix():
|
||||||
|
|
||||||
if platform.system() == "Darwin":
|
if platform.system() == "Darwin":
|
||||||
print("BUILDING FOR MAC")
|
print("BUILDING FOR MAC")
|
||||||
extra_link_args = [get_the_lib_path() + '/libraylib.a', '-framework', 'OpenGL', '-framework', 'Cocoa',
|
flags = os.getenv("RAYLIB_LINK_ARGS")
|
||||||
|
if flags is None:
|
||||||
|
flags = get_the_lib_path_from_pkgconfig() + '/libraylib.a'
|
||||||
|
# We use /usr/local/lib/libraylib.a to ensure we link to static version
|
||||||
|
extra_link_args = flags.split() + ['-framework', 'OpenGL', '-framework', 'Cocoa',
|
||||||
'-framework', 'IOKit', '-framework', 'CoreFoundation', '-framework',
|
'-framework', 'IOKit', '-framework', 'CoreFoundation', '-framework',
|
||||||
'CoreVideo']
|
'CoreVideo']
|
||||||
if RAYLIB_PLATFORM=="SDL":
|
if RAYLIB_PLATFORM=="SDL":
|
||||||
|
@ -191,16 +210,18 @@ def build_unix():
|
||||||
extra_compile_args = ["-Wno-error=incompatible-function-pointer-types", "-D_CFFI_NO_LIMITED_API"]
|
extra_compile_args = ["-Wno-error=incompatible-function-pointer-types", "-D_CFFI_NO_LIMITED_API"]
|
||||||
else: #platform.system() == "Linux":
|
else: #platform.system() == "Linux":
|
||||||
print("BUILDING FOR LINUX")
|
print("BUILDING FOR LINUX")
|
||||||
extra_link_args = get_lib_flags() + [ '-lm', '-lpthread', '-lGL',
|
flags = os.getenv("RAYLIB_LINK_ARGS")
|
||||||
|
if flags is None:
|
||||||
|
flags = get_lib_flags_from_pkgconfig()
|
||||||
|
extra_link_args = flags.split() + [ '-lm', '-lpthread', '-lGL',
|
||||||
'-lrt', '-lm', '-ldl', '-lpthread', '-latomic']
|
'-lrt', '-lm', '-ldl', '-lpthread', '-latomic']
|
||||||
if RAYLIB_PLATFORM=="SDL":
|
if RAYLIB_PLATFORM=="SDL":
|
||||||
extra_link_args += ['-lX11','-lSDL2']
|
extra_link_args += ['-lX11','-lSDL2']
|
||||||
elif RAYLIB_PLATFORM=="DRM":
|
elif RAYLIB_PLATFORM=="DRM":
|
||||||
extra_link_args += get_specified_libs("egl")
|
extra_link_args += ['-lEGL', '-lgbm']
|
||||||
extra_link_args += get_specified_libs("gbm")
|
elif RAYLIB_PLATFORM=="PLATFORM_COMMA":
|
||||||
|
extra_link_args.remove('-lGL')
|
||||||
if ENABLE_WAYLAND_DRM_LEASING != "":
|
extra_link_args += ['-lGLESv2', '-lEGL', '-lwayland-client', '-lwayland-egl']
|
||||||
extra_link_args += get_specified_libs("wayland-client")
|
|
||||||
else:
|
else:
|
||||||
extra_link_args += ['-lX11']
|
extra_link_args += ['-lX11']
|
||||||
extra_compile_args = ["-Wno-incompatible-pointer-types", "-D_CFFI_NO_LIMITED_API"]
|
extra_compile_args = ["-Wno-incompatible-pointer-types", "-D_CFFI_NO_LIMITED_API"]
|
||||||
|
@ -213,7 +234,8 @@ def build_unix():
|
||||||
ffibuilder.set_source("raylib._raylib_cffi",
|
ffibuilder.set_source("raylib._raylib_cffi",
|
||||||
ffi_includes,
|
ffi_includes,
|
||||||
py_limited_api=False,
|
py_limited_api=False,
|
||||||
include_dirs=[get_the_include_path()],
|
include_dirs=[raylib_include_path, raygui_include_path, physac_include_path, glfw_include_path,
|
||||||
|
libffi_include_path],
|
||||||
extra_link_args=extra_link_args,
|
extra_link_args=extra_link_args,
|
||||||
extra_compile_args=extra_compile_args,
|
extra_compile_args=extra_compile_args,
|
||||||
libraries=libraries)
|
libraries=libraries)
|
||||||
|
@ -221,13 +243,13 @@ def build_unix():
|
||||||
|
|
||||||
def build_windows():
|
def build_windows():
|
||||||
print("BUILDING FOR WINDOWS")
|
print("BUILDING FOR WINDOWS")
|
||||||
ffibuilder.cdef((THIS_DIR / "raylib.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/raylib.h.modified").read())
|
||||||
if RAYLIB_PLATFORM=="Desktop":
|
if RAYLIB_PLATFORM=="Desktop":
|
||||||
ffibuilder.cdef((THIS_DIR / "glfw3.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/glfw3.h.modified").read())
|
||||||
ffibuilder.cdef((THIS_DIR / "rlgl.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/rlgl.h.modified").read())
|
||||||
ffibuilder.cdef((THIS_DIR / "raygui.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/raygui.h.modified").read())
|
||||||
ffibuilder.cdef((THIS_DIR / "physac.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/physac.h.modified").read())
|
||||||
ffibuilder.cdef((THIS_DIR / "raymath.h.modified").read_text())
|
ffibuilder.cdef(open("raylib/raymath.h.modified").read())
|
||||||
|
|
||||||
ffi_includes = """
|
ffi_includes = """
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
@ -258,10 +280,10 @@ def build_windows():
|
||||||
extra_compile_args=["/D_CFFI_NO_LIMITED_API"],
|
extra_compile_args=["/D_CFFI_NO_LIMITED_API"],
|
||||||
py_limited_api=False,
|
py_limited_api=False,
|
||||||
libraries=libraries,
|
libraries=libraries,
|
||||||
include_dirs=[str(REPO_ROOT / 'raylib-c/src'),
|
include_dirs=['D:\\a\\raylib-python-cffi\\raylib-python-cffi\\raylib-c\\src',
|
||||||
str(REPO_ROOT / 'raylib-c/src/external/glfw/include'),
|
'D:\\a\\raylib-python-cffi\\raylib-python-cffi\\raylib-c\\src\\external\\glfw\\include',
|
||||||
str(REPO_ROOT / 'raygui/src'),
|
'D:\\a\\raylib-python-cffi\\raylib-python-cffi\\raygui\\src',
|
||||||
str(REPO_ROOT / 'physac/src')],
|
'D:\\a\\raylib-python-cffi\\raylib-python-cffi\\physac\\src'],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* rlgl v5.0 - A multi-OpenGL abstraction layer with an immediate-mode style API
|
* rlgl v5.0 - A multi-OpenGL abstraction layer with an immediate-mode style API
|
||||||
*
|
*
|
||||||
* DESCRIPTION:
|
* DESCRIPTION:
|
||||||
* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0)
|
* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0, ES 3.0)
|
||||||
* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
|
* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
|
||||||
*
|
*
|
||||||
* ADDITIONAL NOTES:
|
* ADDITIONAL NOTES:
|
||||||
|
|
30
shell.nix
30
shell.nix
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
pkgs ? import <nixpkgs> { },
|
|
||||||
}: pkgs.mkShell {
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
python3
|
|
||||||
cmake
|
|
||||||
clang-tools
|
|
||||||
pkg-config
|
|
||||||
wayland-scanner
|
|
||||||
wayland
|
|
||||||
libGL
|
|
||||||
libgbm
|
|
||||||
libdrm
|
|
||||||
xorg.libXi
|
|
||||||
xorg.libXcursor
|
|
||||||
xorg.libXrandr
|
|
||||||
xorg.libXinerama
|
|
||||||
xorg.libX11
|
|
||||||
];
|
|
||||||
|
|
||||||
shellHook = ''
|
|
||||||
export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath [ pkgs.xorg.libX11 pkgs.libGL ]}:$LD_LIBRARY_PATH"
|
|
||||||
|
|
||||||
if [ ! -d ".venv" ]; then
|
|
||||||
python3 -m venv .venv
|
|
||||||
fi
|
|
||||||
|
|
||||||
source .venv/bin/activate
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -7,8 +7,6 @@ import pyray as pr
|
||||||
pr.init_window(800, 450, "Raylib texture test")
|
pr.init_window(800, 450, "Raylib texture test")
|
||||||
pr.set_target_fps(60)
|
pr.set_target_fps(60)
|
||||||
|
|
||||||
test_typedef_init = pr.Texture2D() # Texture2D is typedef for Texture
|
|
||||||
|
|
||||||
image = pr.gen_image_color(800, 400, (0,0,0,255) )
|
image = pr.gen_image_color(800, 400, (0,0,0,255) )
|
||||||
texture = pr.load_texture_from_image(image)
|
texture = pr.load_texture_from_image(image)
|
||||||
pr.update_texture(texture, image.data)
|
pr.update_texture(texture, image.data)
|
||||||
|
|
Reference in a new issue