Определение позиции дочернего объекта

This commit is contained in:
2026-02-26 21:33:09 +03:00
parent 77604e7b2b
commit 2ab6bcd408
8 changed files with 84 additions and 50 deletions

View File

@@ -1,6 +1,9 @@
const Point2_f = @import("../models/basic_models.zig").Point2_f;
const basic_models = @import("../models/basic_models.zig");
const Point2_f = basic_models.Point2_f;
const Canvas = @import("../Canvas.zig");
const Document = @import("../models/Document.zig");
const pipeline = @import("../render/cpu/pipeline.zig");
const Transform = pipeline.Transform;
pub const ToolContext = struct {
canvas: *Canvas,
@@ -8,11 +11,41 @@ pub const ToolContext = struct {
selected_object_id: ?u64,
pub fn addObject(self: *const ToolContext, template: Document.Object) !void {
try self.canvas.document.addObjectUnderParentId(self.selected_object_id, template);
var obj = template;
const local_pos = self.computeLocalPosition();
try obj.setProperty(self.canvas.document.allocator, .{ .data = .{ .position = local_pos } });
try self.canvas.document.addObjectUnderParentId(self.selected_object_id, obj);
self.canvas.requestRedraw();
}
fn computeLocalPosition(self: *const ToolContext) Point2_f {
if (self.selected_object_id) |parent_id| {
if (findWorldTransformById(self.canvas.document, parent_id)) |parent_world| {
return pipeline.worldToLocalTransform(parent_world, self.document_point.x, self.document_point.y);
}
}
return self.document_point;
}
};
fn findWorldTransformById(doc: *Document, target_id: u64) ?Transform {
const identity = Transform{};
for (doc.objects.items) |*obj| {
if (findWorldTransformInTree(obj, identity, target_id)) |t| return t;
}
return null;
}
fn findWorldTransformInTree(obj: *const Document.Object, parent: Transform, target_id: u64) ?Transform {
const local = Transform.init(obj);
const world = Transform.compose(parent, local);
if (obj.id == target_id) return world;
for (obj.children.items) |*child| {
if (findWorldTransformInTree(child, world, target_id)) |t| return t;
}
return null;
}
pub const Tool = struct {
onCanvasClick: *const fn (*const ToolContext) anyerror!void,
};

View File

@@ -5,7 +5,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
var obj = shape.createObject(canvas.document.allocator, .arc) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -5,7 +5,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
var obj = shape.createObject(canvas.document.allocator, .broken) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -5,7 +5,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
var obj = shape.createObject(canvas.document.allocator, .ellipse) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };

View File

@@ -7,7 +7,6 @@ fn onCanvasClick(ctx: *const Tool.ToolContext) !void {
const canvas = ctx.canvas;
var obj = shape.createObject(canvas.document.allocator, .line) catch return;
defer obj.deinit(canvas.allocator);
try obj.setProperty(canvas.document.allocator, .{ .data = .{ .position = ctx.document_point } });
try ctx.addObject(obj);
}
pub const tool = Tool.Tool{ .onCanvasClick = onCanvasClick };