From d8f5dee46d13b8f5f517822308a7ee915fb7c5c7 Mon Sep 17 00:00:00 2001 From: bdrtr Date: Thu, 11 Sep 2025 04:24:52 +0300 Subject: [PATCH] gui buttons --- build.zig | 54 +++++++++++++++++++-------- src/graphics/base_drawers.zig | 35 ++++++++++++++++-- src/graphics/gui.zig | 29 ++++++++++++++- src/input/base_input.zig | 69 ++++++++++++++--------------------- src/main.zig | 7 ++-- 5 files changed, 128 insertions(+), 66 deletions(-) diff --git a/build.zig b/build.zig index 5569f99..3f50adb 100644 --- a/build.zig +++ b/build.zig @@ -74,22 +74,6 @@ pub fn build(b: *std.Build) void { }, }); - const mod3 = b.addModule("GuiOps", .{ - // The root source file is the "entry point" of this module. Users of - // this module will only be able to access public declarations contained - // in this file, which means that if you have declarations that you - // intend to expose to consumers that were defined in other files part - // of this module, you will have to make sure to re-export them from - // the root file. - .root_source_file = b.path("src/graphics/gui.zig"), - // Later on we'll use this module as the root module of a test executable - // which requires us to specify a target. - .target = target, - .imports = &.{ - .{.name = "raylib", .module = raylib}, - .{.name = "raygui", .module = raygui}, - }, - }); const mod4 = b.addModule("InputOps", .{ // The root source file is the "entry point" of this module. Users of @@ -108,6 +92,43 @@ pub fn build(b: *std.Build) void { }, }); + const mod3 = b.addModule("GuiOps", .{ + // The root source file is the "entry point" of this module. Users of + // this module will only be able to access public declarations contained + // in this file, which means that if you have declarations that you + // intend to expose to consumers that were defined in other files part + // of this module, you will have to make sure to re-export them from + // the root file. + .root_source_file = b.path("src/graphics/gui.zig"), + // Later on we'll use this module as the root module of a test executable + // which requires us to specify a target. + .target = target, + .imports = &.{ + .{.name = "raylib", .module = raylib}, + .{.name = "raygui", .module = raygui}, + .{ .name= "InputOps", .module = mod4 }, + }, + }); + + const mod5 = b.addModule("BaseDraw", .{ + // The root source file is the "entry point" of this module. Users of + // this module will only be able to access public declarations contained + // in this file, which means that if you have declarations that you + // intend to expose to consumers that were defined in other files part + // of this module, you will have to make sure to re-export them from + // the root file. + .root_source_file = b.path("src/graphics/base_drawers.zig"), + // Later on we'll use this module as the root module of a test executable + // which requires us to specify a target. + .target = target, + .imports = &.{ + .{.name = "raylib", .module = raylib}, + .{.name = "raygui", .module = raygui}, + .{ .name= "InputOps", .module = mod4 }, + .{ .name= "Cam", .module = mod2 }, + }, + }); + // Here we define an executable. An executable needs to have a root module // which needs to expose a `main` function. While we could add a main function // to the module defined above, it's sometimes preferable to split business @@ -149,6 +170,7 @@ pub fn build(b: *std.Build) void { .{ .name = "Cam", .module = mod2 }, .{ .name= "Gui", .module = mod3 }, .{ .name= "InputOps", .module = mod4 }, + .{ .name= "BaseDraw", .module = mod5 }, }, }), }); diff --git a/src/graphics/base_drawers.zig b/src/graphics/base_drawers.zig index 6b0f6a4..16b6770 100644 --- a/src/graphics/base_drawers.zig +++ b/src/graphics/base_drawers.zig @@ -1,5 +1,34 @@ +const std = @import("std"); +const rl = @import("raylib"); +const cm = @import("Cam"); +const b_inp = @import("InputOps"); -pub fn add(a : f32, b : f32) f32 { - return a + b; -} \ No newline at end of file +// Raylib döngüsünde kullanmak için çizim fonksiyonu +pub fn drawShapes(shapes : *std.ArrayList(b_inp.Shape)) void { + for (shapes.items, 0..) |shape, index| { + // Seçili nesneyi işaretle + if (b_inp.selected_shape_index) |sel_index| { + if (index == sel_index) { + // Seçili nesnenin sınırlarını çiz + switch (shape.data) { + .cube => |d| { + //const box = getBoundingBoxForCube(shape.position, d.width, d.height, d.length); + //rl.drawCubeWiresV(box.min, box.max, .yellow); + rl.drawCubeWires(shape.position, d.width + 0.5, d.height + 0.5, d.length + 0.5, .green); + }, + .sphere => |d| rl.drawSphereWires(shape.position, d.radius + 0.5, 16, 16, .green), + .cylinder => |d| rl.drawCylinderWires(shape.position, d.radius + 0.5, d.radius + 0.5, d.height, 10, .green), + } + } + } + + // Asıl nesneyi çiz + switch (shape.data) { + .cube => |d| rl.drawCubeV(shape.position, rl.Vector3.init(d.width, d.height, d.length), shape.color), + .sphere => |d| rl.drawSphere(shape.position, d.radius, shape.color), + .cylinder => |d| rl.drawCylinder(shape.position, d.radius, d.radius, d.height, 10, shape.color), + } + } +} + diff --git a/src/graphics/gui.zig b/src/graphics/gui.zig index a38e450..44f0317 100644 --- a/src/graphics/gui.zig +++ b/src/graphics/gui.zig @@ -1,6 +1,7 @@ const gui = @import("raygui"); const rl = @import("raylib"); const std = @import("std"); +const io = @import("InputOps"); pub var is_cursor_hidden: bool = undefined; @@ -26,10 +27,36 @@ pub const GUI = struct { self.guiPos.width = self.width / 4.0; self.guiPos.x = self.width / 4.0 * 3.0; self.guiPos.y = 0.0; + + //gui pos sağ menunun güncel halidir } - pub fn draw(self: *GUI) void { + pub fn draw(self: *GUI, shapes : std.ArrayList(io.Shape)) void { //panel rl.drawRectangleRec(self.guiPos, .red); + try self.objects(shapes); } + + + pub fn objects(self: *GUI, shapes: std.ArrayList(io.Shape)) !void { + const button_height: f32 = 25; // Her düğmenin yüksekliği + const button_spacing: f32 = 5; // Düğmeler arası boşluk + + for (shapes.items, 0..) |shape, i| { + // Her düğme için pozisyon hesapla + const button_positions = rl.Rectangle.init( + self.guiPos.x + 15, + self.guiPos.y + 15 + (@as(f32, @floatFromInt(i)) * (button_height + button_spacing)), + self.guiPos.width - 30, // Genişlik + button_height, + ); + + // GuiButton kullanarak şekil adını yazdır + // GuiButton, tıklanırsa true, tıklanmazsa false döner + if (gui.button(button_positions, shape.name)) { + std.debug.print("Seçilen şekil: {s}, ID: {}\n", .{shape.name, shape.id}); + } + } + } + }; diff --git a/src/input/base_input.zig b/src/input/base_input.zig index 75d25cb..4967225 100644 --- a/src/input/base_input.zig +++ b/src/input/base_input.zig @@ -5,9 +5,10 @@ const cm = @import("Cam"); pub var is_object_dragging : bool = undefined; // drag işlemi için gerekli pub var freeMode = false; -// ışın ve ışına bağlı çarpışma ray ve raycollison değişkenleri ile yapılır. +pub var count_id : usize = 0; // bu değişken anlık id'yi tutar -var selected_shape_index:?usize = 0; +// ışın ve ışına bağlı çarpışma ray ve raycollison değişkenleri ile yapılır. +pub var selected_shape_index:?usize = 0; pub const ShapeType = enum { cube, @@ -17,6 +18,8 @@ pub const ShapeType = enum { }; //tipler pub const Shape = struct { + id : usize = 0, + name : [:0]const u8, position: rl.Vector3, color: rl.Color, @@ -37,7 +40,10 @@ pub const Shape = struct { }, pub fn initCube(position: rl.Vector3, color: rl.Color, width: f32, height: f32, length: f32) Shape { + count_id += 1; return Shape{ + .id = count_id, + .name = "count_id", .position = position, .color = color, .data = .{ .cube = .{ .width = width, .height = height, .length = length } }, @@ -46,7 +52,10 @@ pub const Shape = struct { // Küre için özel init metodu pub fn initSphere(position: rl.Vector3, color: rl.Color, radius: f32) Shape { + count_id += 1; return Shape{ + .id = count_id, + .name= "count_id", .position = position, .color = color, .data = .{ .sphere = .{ .radius = radius } }, @@ -55,7 +64,10 @@ pub const Shape = struct { // Silindir için özel init metodu pub fn initCylinder(position: rl.Vector3, color: rl.Color, radius: f32, height: f32) Shape { + count_id += 1; return Shape{ + .id = count_id, + .name = "count_id", .position = position, .color = color, .data = .{ .cylinder = .{ .radius = radius, .height = height } }, @@ -64,34 +76,6 @@ pub const Shape = struct { }; -// Raylib döngüsünde kullanmak için çizim fonksiyonu -pub fn drawShapes(shapes : *std.ArrayList(Shape)) void { - for (shapes.items, 0..) |shape, index| { - // Seçili nesneyi işaretle - if (selected_shape_index) |sel_index| { - if (index == sel_index) { - // Seçili nesnenin sınırlarını çiz - switch (shape.data) { - .cube => |d| { - //const box = getBoundingBoxForCube(shape.position, d.width, d.height, d.length); - //rl.drawCubeWiresV(box.min, box.max, .yellow); - rl.drawCubeWires(shape.position, d.width + 0.5, d.height + 0.5, d.length + 0.5, .green); - }, - .sphere => |d| rl.drawSphereWires(shape.position, d.radius + 0.5, 16, 16, .green), - .cylinder => |d| rl.drawCylinderWires(shape.position, d.radius + 0.5, d.radius + 0.5, d.height, 10, .green), - } - } - } - - // Asıl nesneyi çiz - switch (shape.data) { - .cube => |d| rl.drawCubeV(shape.position, rl.Vector3.init(d.width, d.height, d.length), shape.color), - .sphere => |d| rl.drawSphere(shape.position, d.radius, shape.color), - .cylinder => |d| rl.drawCylinder(shape.position, d.radius, d.radius, d.height, 10, shape.color), - } - } -} - pub fn findClosestHitObject( mouse_position: rl.Vector2, camera: rl.Camera3D, @@ -138,6 +122,19 @@ pub fn findClosestHitObject( } +pub fn inputControls() void { + + if (rl.isMouseButtonPressed(.right)) { + freeMode = !freeMode; + if (freeMode) { + rl.disableCursor(); + } else { + rl.enableCursor(); + } + } +} + + pub fn getBoundingBoxForCube(position: rl.Vector3, width: f32, height: f32, length: f32) rl.BoundingBox { // Nesnenin boyutlarının yarısını hesapla const half_width = width / 2.0; @@ -180,16 +177,4 @@ pub fn getBoundingBoxForCylinder(position: rl.Vector3, radius: f32, height: f32) .min = rl.Vector3.init(min_x, min_y, min_z), .max = rl.Vector3.init(max_x, max_y, max_z), }; -} - -pub fn inputControls() void { - - if (rl.isMouseButtonPressed(.right)) { - freeMode = !freeMode; - if (freeMode) { - rl.disableCursor(); - } else { - rl.enableCursor(); - } - } } \ No newline at end of file diff --git a/src/main.zig b/src/main.zig index 42629c2..88a8980 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,7 +1,7 @@ const std = @import("std"); const rl = @import("raylib"); const gi = @import("raygui"); -const gr = @import("Drawers"); +const drw = @import("BaseDraw"); const cm = @import("Cam"); const panel = @import("Gui"); const io = @import("InputOps"); @@ -59,15 +59,14 @@ pub fn main() anyerror!void { defer rl.endDrawing(); rl.clearBackground(.ray_white); - rl.beginMode3D(cam); - io.drawShapes(&shapes); + drw.drawShapes(&shapes); rl.drawGrid(10, 1.0); rl.endMode3D(); rl.drawText(rl.textFormat("x:%.2f y:%.2f z:%.2f", .{cam.position.x, cam.position.y, cam.position.z}), 180, 200, 20, .light_gray); rl.drawText(rl.textFormat("x : %d y : %d", .{rl.getScreenWidth(), rl.getScreenHeight()}), 50, 50, 20, .red); - my_gui.draw(); + my_gui.draw(shapes); rl.drawFPS(200, 200); if (io.is_object_dragging) { rl.drawText("Nesne drag...", 10, 10, 20, .dark_gray);