2
0
mirror of https://github.com/raylib-cs/raylib-cs synced 2025-09-09 03:01:41 -04:00

Fixed format

This commit is contained in:
MrScautHD
2024-02-09 19:16:40 +01:00
parent 1fac1c5d50
commit 6f8ea47c27

View File

@@ -18,16 +18,16 @@
********************************************************************************************/
using System.Numerics;
using static Raylib_cs.Raylib;
using Examples.Shared;
using static Raylib_cs.Raylib;
namespace Examples.Shaders;
public class BasicPbr
{
const int GLSL_VERSION = 330;
private const int GLSL_VERSION = 330;
public unsafe static int Main()
public static unsafe int Main()
{
// Initialization
//--------------------------------------------------------------------------------------
@@ -47,10 +47,7 @@ public class BasicPbr
camera.Projection = CameraProjection.Perspective;
// Load PBR shader and setup all required locations
Shader shader = LoadShader(
"resources/shaders/glsl330/pbr.vs",
"resources/shaders/glsl330/pbr.fs"
);
var shader = LoadShader("resources/shaders/glsl330/pbr.vs", "resources/shaders/glsl330/pbr.fs");
shader.Locs[(int)ShaderLocationIndex.MapAlbedo] = GetShaderLocation(shader, "albedoMap");
// WARNING: Metalness, roughness, and ambient occlusion are all packed into a MRA texture
@@ -66,28 +63,28 @@ public class BasicPbr
// Setup additional required shader locations, including lights data
shader.Locs[(int)ShaderLocationIndex.VectorView] = GetShaderLocation(shader, "viewPos");
int lightCountLoc = GetShaderLocation(shader, "numOfLights");
int maxLightCount = 4;
var lightCountLoc = GetShaderLocation(shader, "numOfLights");
var maxLightCount = 4;
SetShaderValue(shader, lightCountLoc, &maxLightCount, ShaderUniformDataType.Int);
// Setup ambient color and intensity parameters
float ambientIntensity = 0.02f;
Color ambientColor = new Color(26, 32, 135, 255);
Vector3 ambientColorNormalized = new Vector3(ambientColor.R / 255.0F, ambientColor.G / 255.0F, ambientColor.B / 255.0F);
var ambientIntensity = 0.02f;
var ambientColor = new Color(26, 32, 135, 255);
var ambientColorNormalized = new Vector3(ambientColor.R / 255.0F, ambientColor.G / 255.0F, ambientColor.B / 255.0F);
SetShaderValue(shader, GetShaderLocation(shader, "ambientColor"), &ambientColorNormalized, ShaderUniformDataType.Vec3);
SetShaderValue(shader, GetShaderLocation(shader, "ambient"), &ambientIntensity, ShaderUniformDataType.Float);
// Get location for shader parameters that can be modified in real time
int emissiveIntensityLoc = GetShaderLocation(shader, "emissivePower");
int emissiveColorLoc = GetShaderLocation(shader, "emissiveColor");
int textureTilingLoc = GetShaderLocation(shader, "tiling");
var emissiveIntensityLoc = GetShaderLocation(shader, "emissivePower");
var emissiveColorLoc = GetShaderLocation(shader, "emissiveColor");
var textureTilingLoc = GetShaderLocation(shader, "tiling");
// Load old car model using PBR maps and shader
// WARNING: We know this model consists of a single model.meshes[0] and
// that model.materials[0] is by default assigned to that mesh
// There could be more complex models consisting of multiple meshes and
// multiple materials defined for those meshes... but always 1 mesh = 1 material
Model car = LoadModel("resources/models/gltf/old_car_new.glb");
var car = LoadModel("resources/models/gltf/old_car_new.glb");
// Assign already setup PBR shader to model.materials[0], used by models.meshes[0]
car.Materials[0].Shader = shader;
@@ -107,7 +104,7 @@ public class BasicPbr
// Load floor model mesh and assign material parameters
// NOTE: A basic plane shape can be generated instead of being loaded from a model file
Model floor = LoadModel("resources/models/gltf/plane.glb");
var floor = LoadModel("resources/models/gltf/plane.glb");
//Mesh floorMesh = GenMeshPlane(10, 10, 10, 10);
//GenMeshTangents(&floorMesh); // TODO: Review tangents generation
//Model floor = LoadModelFromMesh(floorMesh);
@@ -127,18 +124,45 @@ public class BasicPbr
// Models texture tiling parameter can be stored in the Material struct if required (CURRENTLY NOT USED)
// NOTE: Material.params[4] are available for generic parameters storage (float)
Vector2 carTextureTiling = new Vector2(0.5f, 0.5f);
Vector2 floorTextureTiling = new Vector2(0.5f, 0.5f);
var carTextureTiling = new Vector2(0.5f, 0.5f);
var floorTextureTiling = new Vector2(0.5f, 0.5f);
// Create some lights
PbrLight[] lights = new PbrLight[4];
lights[0] = PbrLights.CreateLight(0, PbrLightType.Point, new Vector3(-1.0f, 1.0f, -2.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Yellow, 4.0f, shader);
lights[1] = PbrLights.CreateLight(1, PbrLightType.Point, new Vector3(2.0f, 1.0f, 1.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Green, 3.3f, shader);
lights[2] = PbrLights.CreateLight(2, PbrLightType.Point, new Vector3(-2.0f, 1.0f, 1.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Red, 8.3f, shader);
lights[3] = PbrLights.CreateLight(3, PbrLightType.Point, new Vector3(1.0f, 1.0f, -2.0f), new Vector3(0.0f, 0.0f, 0.0f), Color.Black, 2.0f, shader);
var lights = new PbrLight[4];
lights[0] = PbrLights.CreateLight(
0,
PbrLightType.Point,
new Vector3(-1.0f, 1.0f, -2.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Yellow,
4.0f,
shader);
lights[1] = PbrLights.CreateLight(1,
PbrLightType.Point,
new Vector3(2.0f, 1.0f, 1.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Green,
3.3f,
shader);
lights[2] = PbrLights.CreateLight(
2, PbrLightType.Point,
new Vector3(-2.0f, 1.0f, 1.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Red,
8.3f,
shader);
lights[3] = PbrLights.CreateLight(
3,
PbrLightType.Point,
new Vector3(1.0f, 1.0f, -2.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Color.Black,
2.0f,
shader);
// Setup material texture maps usage in shader
// NOTE: By default, the texture maps are always used
int usage = 1;
var usage = 1;
SetShaderValue(shader, GetShaderLocation(shader, "useTexAlbedo"), &usage, ShaderUniformDataType.Int);
SetShaderValue(shader, GetShaderLocation(shader, "useTexNormal"), &usage, ShaderUniformDataType.Int);
SetShaderValue(shader, GetShaderLocation(shader, "useTexMRA"), &usage, ShaderUniformDataType.Int);
@@ -155,17 +179,32 @@ public class BasicPbr
UpdateCamera(&camera, CameraMode.Orbital);
// Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f })
Vector3 cameraPos = camera.Position;
var cameraPos = camera.Position;
SetShaderValue(shader, shader.Locs[(int)ShaderLocationIndex.VectorView], cameraPos, ShaderUniformDataType.Vec3);
// Check key inputs to enable/disable lights
if (IsKeyPressed(KeyboardKey.One)) { lights[2].Enabled = !lights[2].Enabled; }
if (IsKeyPressed(KeyboardKey.Two)) { lights[1].Enabled = !lights[1].Enabled; }
if (IsKeyPressed(KeyboardKey.Three)) { lights[3].Enabled = !lights[3].Enabled; }
if (IsKeyPressed(KeyboardKey.Four)) { lights[0].Enabled = !lights[0].Enabled; }
if (IsKeyPressed(KeyboardKey.One))
{
lights[2].Enabled = !lights[2].Enabled;
}
if (IsKeyPressed(KeyboardKey.Two))
{
lights[1].Enabled = !lights[1].Enabled;
}
if (IsKeyPressed(KeyboardKey.Three))
{
lights[3].Enabled = !lights[3].Enabled;
}
if (IsKeyPressed(KeyboardKey.Four))
{
lights[0].Enabled = !lights[0].Enabled;
}
// Update light values on shader (actually, only enable/disable them)
for (int i = 0; i < 4; i++)
for (var i = 0; i < 4; i++)
{
UpdateLight(shader, lights[i]);
}
@@ -181,30 +220,26 @@ public class BasicPbr
// Set floor model texture tiling and emissive color parameters on shader
SetShaderValue(shader, textureTilingLoc, &floorTextureTiling, ShaderUniformDataType.Vec2);
Vector4 floorEmissiveColor = ColorNormalize(floor.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color);
var floorEmissiveColor = ColorNormalize(floor.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color);
SetShaderValue(shader, emissiveColorLoc, &floorEmissiveColor, ShaderUniformDataType.Vec4);
DrawModel(floor, Vector3.Zero, 5.0f, Color.White); // Draw floor model
// Set old car model texture tiling, emissive color and emissive intensity parameters on shader
SetShaderValue(shader, textureTilingLoc, &carTextureTiling, ShaderUniformDataType.Vec2);
Vector4 carEmissiveColor = ColorNormalize(car.Materials[0].Maps[(int) MaterialMapIndex.Emission].Color);
var carEmissiveColor = ColorNormalize(car.Materials[0].Maps[(int)MaterialMapIndex.Emission].Color);
SetShaderValue(shader, emissiveColorLoc, &carEmissiveColor, ShaderUniformDataType.Vec4);
float emissiveIntensity = 0.01f;
var emissiveIntensity = 0.01f;
SetShaderValue(shader, emissiveIntensityLoc, &emissiveIntensity, ShaderUniformDataType.Float);
DrawModel(car, Vector3.Zero, 0.005f, Color.White); // Draw car model
// Draw spheres to show the lights positions
for (int i = 0; i < 4; i++)
for (var i = 0; i < 4; i++)
{
var color = lights[i].Color;
var lightColor = new Color(
(byte)(color.X * 255),
(byte)(color.Y * 255),
(byte)(color.Z * 255),
(byte)(color.W * 255)
);
var lightColor = new Color((byte)(color.X * 255), (byte)(color.Y * 255), (byte)(color.Z * 255),
(byte)(color.W * 255));
if (lights[i].Enabled)
{
@@ -249,7 +284,7 @@ public class BasicPbr
return 0;
}
static void UpdateLight(Shader shader, PbrLight light)
private static void UpdateLight(Shader shader, PbrLight light)
{
SetShaderValue(shader, light.EnabledLoc, light.Enabled, ShaderUniformDataType.Int);
SetShaderValue(shader, light.TypeLoc, light.Type, ShaderUniformDataType.Int);