This repository has been archived on 2025-06-21. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
raylib-python-cffi/examples/shaders/shaders_basic_lighting.py
2024-11-17 01:17:05 +00:00

174 lines
6.3 KiB
Python
Executable file

#!/usr/bin/env python3
# /*******************************************************************************************
# *
# * raylib [shaders] example - basic lighting
# *
# * NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
# * OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
# *
# * NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
# *
# * This example has been created using raylib 2.5 (www.raylib.com)
# * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
# *
# * Example contributed by Chris Camacho (@codifies) and reviewed by Ramon Santamaria (@raysan5)
# *
# * Chris Camacho (@codifies - http://bedroomcoders.co.uk/) notes:
# *
# * This is based on the PBR lighting example, but greatly simplified to aid learning...
# * actually there is very little of the PBR example left!
# * When I first looked at the bewildering complexity of the PBR example I feared
# * I would never understand how I could do simple lighting with raylib however its
# * a testement to the authors of raylib (including rlights.h) that the example
# * came together fairly quickly.
# *
# * Copyright (c) 2019 Chris Camacho (@codifies) and Ramon Santamaria (@raysan5)
# *
# *
# ********************************************************************************************/
import raylib as rl
from raylib.colors import *
from dataclasses import dataclass
from enum import Enum
from typing import Any
import math
# a few functions ported from raymath
from rlmath import *
# lighting system
from light_system import *
# Initialization
# --------------------------------------------------------------------------------------
screenWidth = 1200
screenHeight = 720
rl.SetConfigFlags(
rl.FLAG_MSAA_4X_HINT | rl.FLAG_WINDOW_RESIZABLE) # Enable Multi Sampling Anti Aliasing 4x (if available)
rl.InitWindow(screenWidth, screenHeight, b"raylib [shaders] example - basic lighting")
camera = rl.ffi.new('struct Camera3D *', [
[2, 2, 6],
[0, .5, 0],
[0, 1, 0],
45,
rl.CAMERA_PERSPECTIVE
])
# Load models
modelA = rl.LoadModelFromMesh(rl.GenMeshTorus(0.4, 1.0, 16, 32))
modelB = rl.LoadModelFromMesh(rl.GenMeshCube(1.0, 1.0, 1.0))
modelC = rl.LoadModelFromMesh(rl.GenMeshSphere(0.5, 32, 32))
# Load models texture
texture = rl.LoadTexture(b"resources/texel_checker.png")
# Assign texture to default model material
modelA.materials[0].maps[rl.MATERIAL_MAP_ALBEDO].texture = texture
modelB.materials[0].maps[rl.MATERIAL_MAP_ALBEDO].texture = texture
modelC.materials[0].maps[rl.MATERIAL_MAP_ALBEDO].texture = texture
angle = 6.282
# Using 4 point lights, white, red, green and blue
lights0 = Light(LIGHT_POINT, [4, 2, 4], Vector3Zero(), WHITE)
lights1 = Light(LIGHT_POINT, [4, 2, 4], Vector3Zero(), RED)
lights2 = Light(LIGHT_POINT, [0, 4, 2], Vector3Zero(), GREEN)
lights3 = Light(LIGHT_POINT, [0, 4, 2], Vector3Zero(), BLUE)
lightSystem = LightSystem([0.2, 0.2, 0.2, 1.0], lights0, lights1, lights2, lights3)
fogD = rl.GetShaderLocation(lightSystem.shader, b'FogDensity')
fogDensity = 0.0
# All models use the same shader - which lights them
modelA.materials[0].shader = lightSystem.shader
modelB.materials[0].shader = lightSystem.shader
modelC.materials[0].shader = lightSystem.shader
rl.SetTargetFPS(60) # // Set our game to run at 60 frames-per-second
# --------------------------------------------------------------------------------------
# Main game loop
while not rl.WindowShouldClose(): # Detect window close button or ESC key
# Update
# ----------------------------------------------------------------------------------
if rl.IsKeyPressed(rl.KEY_W): lights0.enabled = not lights0.enabled
if rl.IsKeyPressed(rl.KEY_R): lights1.enabled = not lights1.enabled
if rl.IsKeyPressed(rl.KEY_G): lights2.enabled = not lights2.enabled
if rl.IsKeyPressed(rl.KEY_B): lights3.enabled = not lights3.enabled
rl.UpdateCamera(camera, rl.CAMERA_ORBITAL) # Update camera
# Make the lights do differing orbits
angle -= 0.02
lights0.position.x = math.cos(angle) * 4.0
lights0.position.z = math.sin(angle) * 4.0
lights1.position.x = math.cos(-angle * 0.6) * 4.0
lights1.position.z = math.sin(-angle * 0.6) * 4.0
lights2.position.y = math.cos(angle * 0.2) * 4.0
lights2.position.z = math.sin(angle * 0.2) * 4.0
lights3.position.y = math.cos(-angle * 0.35) * 4.0
lights3.position.z = math.sin(-angle * 0.35) * 4.0
# Update the light shader with the camera view position
lightSystem.update(camera.position)
# ffi.cast('wchar_t', x)
# modelA.transform = ffi.cast('Matrix *', MatrixRotateY(angle*1.7))[0]
# modelA.transform = MatrixRotateY(angle*1.7)
# Rotate the torus
# modelA.transform = MatrixMultiply(modelA.transform, MatrixRotateX(-0.025)[0])[0]
# modelA.transform = MatrixMultiply(modelA.transform, MatrixRotateZ(0.012)[0])[0]
modelA.transform = rl.ffi.cast('Matrix *', MatrixMultiply(modelA.transform, MatrixRotateX(-0.025)))[0]
modelA.transform = rl.ffi.cast('Matrix *', MatrixMultiply(modelA.transform, MatrixRotateZ(0.012)))[0]
if (rl.IsKeyPressed(rl.KEY_F)):
rl.ToggleFullscreen()
# ----------------------------------------------------------------------------------
# Draw
# ----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(RAYWHITE)
rl.BeginMode3D(camera[0])
# Draw the three models
rl.DrawModel(modelA, [0, 0, 0], 1.0, WHITE)
rl.DrawModel(modelB, [-1.6, 0, 0], 1.0, WHITE)
rl.DrawModel(modelC, [1.6, 0, 0], 1.0, WHITE)
# Draw markers to show where the lights are
lightSystem.draw()
rl.DrawGrid(10, 1.0)
rl.EndMode3D()
rl.DrawFPS(10, 10)
rl.DrawText(b"Keys RGB & W toggle lights", 10, 30, 20, DARKGRAY)
rl.EndDrawing()
# ----------------------------------------------------------------------------------
# De-Initialization
# --------------------------------------------------------------------------------------
rl.UnloadModel(modelA) # Unload the modelA
rl.UnloadModel(modelB) # Unload the modelB
rl.UnloadModel(modelC) # Unload the modelC
rl.UnloadTexture(texture) # Unload the texture
rl.UnloadShader(lightSystem.shader)
rl.CloseWindow() # Close window and OpenGL context