From 8e5ef1045d04a4e191598636d1deafbed75048d2 Mon Sep 17 00:00:00 2001 From: Woshiwuja <86830770+woshiwuja@users.noreply.github.com> Date: Sun, 16 Feb 2025 19:43:02 +0100 Subject: [PATCH] Added heightmap example (#206) * added heightmap example * better formatting --- build.zig | 10 ++--- examples/models/models_heightmap.zig | 49 ++++++++++++++++++++++++ examples/models/resources/heightmap.png | Bin 0 -> 10883 bytes 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 examples/models/models_heightmap.zig create mode 100644 examples/models/resources/heightmap.png diff --git a/build.zig b/build.zig index 2dbbfad..dcc2a20 100644 --- a/build.zig +++ b/build.zig @@ -373,11 +373,11 @@ pub fn build(b: *std.Build) !void { .desc = "Image loading and texture creation", }, - // .{ - // .name = "models_loading", - // .path = "examples/models/models_loading.zig", - // .desc = "Loads a model and renders it", - // }, + .{ + .name = "models_heightmap", + .path = "examples/models/models_heightmap.zig", + .desc = "Heightmap loading and drawing", + }, // .{ // .name = "shaders_basic_lighting", // .path = "examples/shaders/shaders_basic_lighting.zig", diff --git a/examples/models/models_heightmap.zig b/examples/models/models_heightmap.zig new file mode 100644 index 0000000..425bf83 --- /dev/null +++ b/examples/models/models_heightmap.zig @@ -0,0 +1,49 @@ +const rl = @import("raylib"); + +pub fn main() anyerror!void { + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.initWindow(screenWidth, screenHeight, "raylib [models] example - heightmap loading and drawing"); + const cameraPosition: rl.Vector3 = .{ .x = 18, .y = 21, .z = 18 }; + const cameraTarget: rl.Vector3 = .{ .x = 0, .y = 0, .z = 0 }; + const cameraUp: rl.Vector3 = .{ .x = 0, .y = 1, .z = 0 }; + const cameraProjection = rl.CameraProjection.perspective; + var camera = rl.Camera{ .fovy = 45.0, .position = cameraPosition, .up = cameraUp, .projection = cameraProjection, .target = cameraTarget }; + + const image: rl.Image = try rl.loadImage("examples/models/resources/heightmap.png"); + + const texture: rl.Texture2D = try rl.loadTextureFromImage(image); + + const meshSize = rl.Vector3{ .x = 16, .y = 8, .z = 16 }; + const mesh = rl.genMeshHeightmap(image, meshSize); + + var model = try rl.loadModelFromMesh(mesh); + model.materials[0].maps[@intFromEnum(rl.MATERIAL_MAP_DIFFUSE)].texture = texture; + + const mapPosition = rl.Vector3{ .x = -8.0, .y = 0.0, .z = -8.0 }; + + rl.unloadImage(image); + + rl.setTargetFPS(60); + + while (!rl.windowShouldClose()) { + rl.updateCamera(&camera, rl.CameraMode.orbital); + rl.beginDrawing(); + + rl.clearBackground(rl.Color.ray_white); + rl.beginMode3D(camera); + rl.drawModel(model, mapPosition, 1, rl.Color.red); + rl.drawGrid(20, 1.0); + rl.endMode3D(); + rl.drawTexture(texture, screenWidth - texture.width - 20, 20, rl.Color.white); + rl.drawRectangleLines(screenWidth - texture.width - 20, 20, texture.width, texture.height, rl.Color.green); + rl.drawFPS(10, 10); + + rl.endDrawing(); + } + rl.unloadTexture(texture); + rl.unloadModel(model); + + rl.closeWindow(); +} diff --git a/examples/models/resources/heightmap.png b/examples/models/resources/heightmap.png new file mode 100644 index 0000000000000000000000000000000000000000..474db879d64aa0407714a29efabe5e0db6c246ab GIT binary patch literal 10883 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 Z3;=VGIK*%h$rJzp002ovPDHLkV1m