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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 literal 0 HcmV?d00001