|
@@ -13,8 +13,8 @@
|
|
|
*
|
|
*
|
|
|
* Copyright (c) 2023-2025 Afan OLOVCIC (@_DevDad)
|
|
* Copyright (c) 2023-2025 Afan OLOVCIC (@_DevDad)
|
|
|
*
|
|
*
|
|
|
-* Model: "Old Rusty Car" (https://skfb.ly/LxRy) by Renafox,
|
|
|
|
|
-* licensed under Creative Commons Attribution-NonCommercial
|
|
|
|
|
|
|
+* Model: "Old Rusty Car" (https://skfb.ly/LxRy) by Renafox,
|
|
|
|
|
+* licensed under Creative Commons Attribution-NonCommercial
|
|
|
* (http://creativecommons.org/licenses/by-nc/4.0/)
|
|
* (http://creativecommons.org/licenses/by-nc/4.0/)
|
|
|
*
|
|
*
|
|
|
********************************************************************************************/
|
|
********************************************************************************************/
|
|
@@ -105,7 +105,7 @@ int main()
|
|
|
// shader already takes care of it accordingly
|
|
// shader already takes care of it accordingly
|
|
|
shader.locs[SHADER_LOC_MAP_METALNESS] = GetShaderLocation(shader, "mraMap");
|
|
shader.locs[SHADER_LOC_MAP_METALNESS] = GetShaderLocation(shader, "mraMap");
|
|
|
shader.locs[SHADER_LOC_MAP_NORMAL] = GetShaderLocation(shader, "normalMap");
|
|
shader.locs[SHADER_LOC_MAP_NORMAL] = GetShaderLocation(shader, "normalMap");
|
|
|
- // WARNING: Similar to the MRA map, the emissive map packs different information
|
|
|
|
|
|
|
+ // WARNING: Similar to the MRA map, the emissive map packs different information
|
|
|
// into a single texture: it stores height and emission data
|
|
// into a single texture: it stores height and emission data
|
|
|
// It is binded to SHADER_LOC_MAP_EMISSION location an properly processed on shader
|
|
// It is binded to SHADER_LOC_MAP_EMISSION location an properly processed on shader
|
|
|
shader.locs[SHADER_LOC_MAP_EMISSION] = GetShaderLocation(shader, "emissiveMap");
|
|
shader.locs[SHADER_LOC_MAP_EMISSION] = GetShaderLocation(shader, "emissiveMap");
|
|
@@ -153,7 +153,7 @@ int main()
|
|
|
car.materials[0].maps[MATERIAL_MAP_METALNESS].texture = LoadTexture("resources/old_car_mra.png");
|
|
car.materials[0].maps[MATERIAL_MAP_METALNESS].texture = LoadTexture("resources/old_car_mra.png");
|
|
|
car.materials[0].maps[MATERIAL_MAP_NORMAL].texture = LoadTexture("resources/old_car_n.png");
|
|
car.materials[0].maps[MATERIAL_MAP_NORMAL].texture = LoadTexture("resources/old_car_n.png");
|
|
|
car.materials[0].maps[MATERIAL_MAP_EMISSION].texture = LoadTexture("resources/old_car_e.png");
|
|
car.materials[0].maps[MATERIAL_MAP_EMISSION].texture = LoadTexture("resources/old_car_e.png");
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// Load floor model mesh and assign material parameters
|
|
// Load floor model mesh and assign material parameters
|
|
|
// NOTE: A basic plane shape can be generated instead of being loaded from a model file
|
|
// NOTE: A basic plane shape can be generated instead of being loaded from a model file
|
|
|
Model floor = LoadModel("resources/models/plane.glb");
|
|
Model floor = LoadModel("resources/models/plane.glb");
|
|
@@ -161,9 +161,9 @@ int main()
|
|
|
//GenMeshTangents(&floorMesh); // TODO: Review tangents generation
|
|
//GenMeshTangents(&floorMesh); // TODO: Review tangents generation
|
|
|
//Model floor = LoadModelFromMesh(floorMesh);
|
|
//Model floor = LoadModelFromMesh(floorMesh);
|
|
|
|
|
|
|
|
- // Assign material shader for our floor model, same PBR shader
|
|
|
|
|
|
|
+ // Assign material shader for our floor model, same PBR shader
|
|
|
floor.materials[0].shader = shader;
|
|
floor.materials[0].shader = shader;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
floor.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE;
|
|
floor.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE;
|
|
|
floor.materials[0].maps[MATERIAL_MAP_METALNESS].value = 0.8f;
|
|
floor.materials[0].maps[MATERIAL_MAP_METALNESS].value = 0.8f;
|
|
|
floor.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value = 0.1f;
|
|
floor.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value = 0.1f;
|
|
@@ -193,7 +193,7 @@ int main()
|
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexNormal"), &usage, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexNormal"), &usage, SHADER_UNIFORM_INT);
|
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexMRA"), &usage, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexMRA"), &usage, SHADER_UNIFORM_INT);
|
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexEmissive"), &usage, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, GetShaderLocation(shader, "useTexEmissive"), &usage, SHADER_UNIFORM_INT);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
|
|
//---------------------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------------------
|
|
|
|
|
|
|
@@ -221,11 +221,11 @@ int main()
|
|
|
// Draw
|
|
// Draw
|
|
|
//----------------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------------
|
|
|
BeginDrawing();
|
|
BeginDrawing();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
ClearBackground(BLACK);
|
|
ClearBackground(BLACK);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
BeginMode3D(camera);
|
|
BeginMode3D(camera);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// Set floor model texture tiling and emissive color parameters on shader
|
|
// Set floor model texture tiling and emissive color parameters on shader
|
|
|
SetShaderValue(shader, textureTilingLoc, &floorTextureTiling, SHADER_UNIFORM_VEC2);
|
|
SetShaderValue(shader, textureTilingLoc, &floorTextureTiling, SHADER_UNIFORM_VEC2);
|
|
|
Vector4 floorEmissiveColor = ColorNormalize(floor.materials[0].maps[MATERIAL_MAP_EMISSION].color);
|
|
Vector4 floorEmissiveColor = ColorNormalize(floor.materials[0].maps[MATERIAL_MAP_EMISSION].color);
|
|
@@ -234,7 +234,7 @@ int main()
|
|
|
// Set floor metallic and roughness values
|
|
// Set floor metallic and roughness values
|
|
|
SetShaderValue(shader, metallicValueLoc, &floor.materials[0].maps[MATERIAL_MAP_METALNESS].value, SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(shader, metallicValueLoc, &floor.materials[0].maps[MATERIAL_MAP_METALNESS].value, SHADER_UNIFORM_FLOAT);
|
|
|
SetShaderValue(shader, roughnessValueLoc, &floor.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value, SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(shader, roughnessValueLoc, &floor.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value, SHADER_UNIFORM_FLOAT);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
DrawModel(floor, (Vector3){ 0.0f, 0.0f, 0.0f }, 5.0f, WHITE); // Draw floor model
|
|
DrawModel(floor, (Vector3){ 0.0f, 0.0f, 0.0f }, 5.0f, WHITE); // Draw floor model
|
|
|
|
|
|
|
|
// Set old car model texture tiling, emissive color and emissive intensity parameters on shader
|
|
// Set old car model texture tiling, emissive color and emissive intensity parameters on shader
|
|
@@ -247,24 +247,24 @@ int main()
|
|
|
// Set old car metallic and roughness values
|
|
// Set old car metallic and roughness values
|
|
|
SetShaderValue(shader, metallicValueLoc, &car.materials[0].maps[MATERIAL_MAP_METALNESS].value, SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(shader, metallicValueLoc, &car.materials[0].maps[MATERIAL_MAP_METALNESS].value, SHADER_UNIFORM_FLOAT);
|
|
|
SetShaderValue(shader, roughnessValueLoc, &car.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value, SHADER_UNIFORM_FLOAT);
|
|
SetShaderValue(shader, roughnessValueLoc, &car.materials[0].maps[MATERIAL_MAP_ROUGHNESS].value, SHADER_UNIFORM_FLOAT);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
DrawModel(car, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.25f, WHITE); // Draw car model
|
|
DrawModel(car, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.25f, WHITE); // Draw car model
|
|
|
|
|
|
|
|
// Draw spheres to show the lights positions
|
|
// Draw spheres to show the lights positions
|
|
|
for (int i = 0; i < MAX_LIGHTS; i++)
|
|
for (int i = 0; i < MAX_LIGHTS; i++)
|
|
|
{
|
|
{
|
|
|
Color lightColor = (Color){ lights[i].color[0]*255, lights[i].color[1]*255, lights[i].color[2]*255, lights[i].color[3]*255 };
|
|
Color lightColor = (Color){ lights[i].color[0]*255, lights[i].color[1]*255, lights[i].color[2]*255, lights[i].color[3]*255 };
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lightColor);
|
|
if (lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lightColor);
|
|
|
else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lightColor, 0.3f));
|
|
else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lightColor, 0.3f));
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
EndMode3D();
|
|
EndMode3D();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
DrawText("Toggle lights: [1][2][3][4]", 10, 40, 20, LIGHTGRAY);
|
|
DrawText("Toggle lights: [1][2][3][4]", 10, 40, 20, LIGHTGRAY);
|
|
|
|
|
|
|
|
DrawText("(c) Old Rusty Car model by Renafox (https://skfb.ly/LxRy)", screenWidth - 320, screenHeight - 20, 10, LIGHTGRAY);
|
|
DrawText("(c) Old Rusty Car model by Renafox (https://skfb.ly/LxRy)", screenWidth - 320, screenHeight - 20, 10, LIGHTGRAY);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
DrawFPS(10, 10);
|
|
DrawFPS(10, 10);
|
|
|
|
|
|
|
|
EndDrawing();
|
|
EndDrawing();
|
|
@@ -273,20 +273,20 @@ int main()
|
|
|
|
|
|
|
|
// De-Initialization
|
|
// De-Initialization
|
|
|
//--------------------------------------------------------------------------------------
|
|
//--------------------------------------------------------------------------------------
|
|
|
- // Unbind (disconnect) shader from car.material[0]
|
|
|
|
|
|
|
+ // Unbind (disconnect) shader from car.material[0]
|
|
|
// to avoid UnloadMaterial() trying to unload it automatically
|
|
// to avoid UnloadMaterial() trying to unload it automatically
|
|
|
car.materials[0].shader = (Shader){ 0 };
|
|
car.materials[0].shader = (Shader){ 0 };
|
|
|
UnloadMaterial(car.materials[0]);
|
|
UnloadMaterial(car.materials[0]);
|
|
|
car.materials[0].maps = NULL;
|
|
car.materials[0].maps = NULL;
|
|
|
UnloadModel(car);
|
|
UnloadModel(car);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
floor.materials[0].shader = (Shader){ 0 };
|
|
floor.materials[0].shader = (Shader){ 0 };
|
|
|
UnloadMaterial(floor.materials[0]);
|
|
UnloadMaterial(floor.materials[0]);
|
|
|
floor.materials[0].maps = NULL;
|
|
floor.materials[0].maps = NULL;
|
|
|
UnloadModel(floor);
|
|
UnloadModel(floor);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
UnloadShader(shader); // Unload Shader
|
|
UnloadShader(shader); // Unload Shader
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
CloseWindow(); // Close window and OpenGL context
|
|
CloseWindow(); // Close window and OpenGL context
|
|
|
//--------------------------------------------------------------------------------------
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
|
|
|
@@ -310,7 +310,7 @@ static Light CreateLight(int type, Vector3 position, Vector3 target, Color color
|
|
|
light.color[2] = (float)color.b/255.0f;
|
|
light.color[2] = (float)color.b/255.0f;
|
|
|
light.color[3] = (float)color.a/255.0f;
|
|
light.color[3] = (float)color.a/255.0f;
|
|
|
light.intensity = intensity;
|
|
light.intensity = intensity;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// NOTE: Shader parameters names for lights must match the requested ones
|
|
// NOTE: Shader parameters names for lights must match the requested ones
|
|
|
light.enabledLoc = GetShaderLocation(shader, TextFormat("lights[%i].enabled", lightCount));
|
|
light.enabledLoc = GetShaderLocation(shader, TextFormat("lights[%i].enabled", lightCount));
|
|
|
light.typeLoc = GetShaderLocation(shader, TextFormat("lights[%i].type", lightCount));
|
|
light.typeLoc = GetShaderLocation(shader, TextFormat("lights[%i].type", lightCount));
|
|
@@ -318,7 +318,7 @@ static Light CreateLight(int type, Vector3 position, Vector3 target, Color color
|
|
|
light.targetLoc = GetShaderLocation(shader, TextFormat("lights[%i].target", lightCount));
|
|
light.targetLoc = GetShaderLocation(shader, TextFormat("lights[%i].target", lightCount));
|
|
|
light.colorLoc = GetShaderLocation(shader, TextFormat("lights[%i].color", lightCount));
|
|
light.colorLoc = GetShaderLocation(shader, TextFormat("lights[%i].color", lightCount));
|
|
|
light.intensityLoc = GetShaderLocation(shader, TextFormat("lights[%i].intensity", lightCount));
|
|
light.intensityLoc = GetShaderLocation(shader, TextFormat("lights[%i].intensity", lightCount));
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
UpdateLight(shader, light);
|
|
UpdateLight(shader, light);
|
|
|
|
|
|
|
|
lightCount++;
|
|
lightCount++;
|
|
@@ -333,7 +333,7 @@ static void UpdateLight(Shader shader, Light light)
|
|
|
{
|
|
{
|
|
|
SetShaderValue(shader, light.enabledLoc, &light.enabled, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, light.enabledLoc, &light.enabled, SHADER_UNIFORM_INT);
|
|
|
SetShaderValue(shader, light.typeLoc, &light.type, SHADER_UNIFORM_INT);
|
|
SetShaderValue(shader, light.typeLoc, &light.type, SHADER_UNIFORM_INT);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// Send to shader light position values
|
|
// Send to shader light position values
|
|
|
float position[3] = { light.position.x, light.position.y, light.position.z };
|
|
float position[3] = { light.position.x, light.position.y, light.position.z };
|
|
|
SetShaderValue(shader, light.positionLoc, position, SHADER_UNIFORM_VEC3);
|
|
SetShaderValue(shader, light.positionLoc, position, SHADER_UNIFORM_VEC3);
|