BUI: Tách giao diện Blender thành thư viện UI đa ngôn ngữ
Dự án BUI trích xuất phần giao diện và bộ tương tác của Blender thành một thư viện UI độc lập, dùng được từ Python, Rust, JavaScript/React, C, C++ và Dear ImGui. Điểm đáng chú ý là hiệu năng: theo tác giả, BUI tốn ít CPU hơn gpui mỗi khung hình, khởi động nhanh và chỉ vẽ lại vùng bị thay đổi.

Blender nổi tiếng nhờ giao diện mượt và tiết kiệm tài nguyên, nhưng suốt nhiều thập kỷ phần mã đó gắn chặt với chính Blender. Dự án BUI (Blender UI) tách riêng phần vẽ widget, quy tắc tương tác và giao diện của Blender thành một thư viện UI độc lập, cho phép lập trình viên dùng lại từ Python, Rust, JavaScript/React, C, C++ và Dear ImGui.
Theo mô tả trên GitHub, BUI không phải bản mô phỏng lại giao diện Blender mà là một cổng chuyển mã C dựa trên chính mã UI của Blender. Phần lõi gọi là kit — một runtime viết bằng C, chứa toàn bộ widget trong một cây duy nhất, chịu trách nhiệm bố cục (layout), xử lý chuột và bàn phím, rồi vẽ theo đúng cách Blender vẽ.
Huy hiệu phiên bản PyPI của blenderui
BUI thực chất là gì
Điểm cốt lõi: mã vẽ widget của BUI là bản chuyển sang C từ tệp interface_widgets.cc của Blender (các hàm như round_box_edges, widgetbase_draw, bảng hình khối), còn quy tắc tương tác bám theo interface_handlers.cc. Phần toán màu, hình chữ nhật, con trỏ văn bản, tìm kiếm chuỗi và đánh giá biểu thức lấy từ blenlib của Blender.
Tác giả nêu rõ BUI không phải Blender: không cần cài Blender, không cần biết Blender để dùng. Nó cũng không phải trình duyệt: dù phía Rust và JavaScript dùng HTML/CSS làm ngôn ngữ giao diện, bên trong không có engine trình duyệt, không webview, không mạng.
Về kiến trúc, mã người dùng tạo widget và khai báo callback; kit giữ chúng trong một cây, bố cục và xử lý input theo luật Blender; bộ render vẽ lên CPU mặc định hoặc GPU nếu bật.
Hành vi giao diện kiểu Blender
Các tương tác đặc trưng của Blender được đưa vào kit bằng C nên hoạt động giống nhau ở mọi ngôn ngữ:
- Kéo để chỉnh số: nhấn vào ô số rồi kéo ngang, con trỏ chuột ẩn đi và quấn vòng nên không bao giờ chạm mép màn hình. Giữ Shift để chỉnh chính xác, Ctrl để bắt bước theo luật Blender (góc bắt 10°, số nguyên bắt bội số 10).
- Gõ công thức vào ô số: dùng chính bộ đánh giá biểu thức của Blender (
expr_pylike_eval.cc), nên2*pi,90/4,min(4, 3)hayx if c else yđều cho ra số. - Phím tắt trên mọi giá trị: Backspace đặt lại mặc định, dấu
-đảo dấu, Ctrl+Wheel tăng giảm từng bước, Ctrl+C / Ctrl+V sao chép và dán. - Kéo nhiều ô một lúc: kéo dọc qua một cột ô số để gom lại rồi kéo ngang để đổi đồng loạt; kéo qua các checkbox để bật tất cả trong một nét.
- Menu tìm kiếm mờ: gõ chữ trong menu đang mở, ví dụ "ad cu" sẽ tìm ra "Add Cube", chịu được lỗi gõ và ưu tiên mục vừa chọn gần đây.
- Hoàn tác ở mọi nơi: Ctrl+Z / Ctrl+Shift+Z áp dụng cho mọi chỉnh sửa giao diện, kể cả khi đang gõ trong ô văn bản.
Huy hiệu phiên bản crate trên crates.io
Đa ngôn ngữ, một lõi chung
Vì mọi binding đều nói chuyện với cùng một kit C, hành vi widget thống nhất giữa các ngôn ngữ. Các đường vào chính gồm:
- Python: gói
blenderuitrên PyPI cung cấp bốn API trong một — cú pháp tkinter (tuyên bố phủ đủ 7.846 tên công khai của tkinter và ttk), cú pháp Qt, 45 component gốc của Blender, và Dear ImGui. Có thể chạy chương trình tkinter sẵn có mà không sửa một dòng bằng lệnhblenderui-tk my_app.py. - Rust: crate
blenderuitrên crates.io, hỗ trợ toàn bộ 113 phần tử HTML, CSS hiện đại (flexbox, grid,calc(),:has(),@container), Tailwind CSS v4, macrorsx!/view!và cả cú pháp builder kiểu gpui. - JavaScript/React: gói
@blender-ui/reactcho React 19.3 render trực tiếp lên BUI, và@blender-ui/nativecho API kiểu DOM, chạy trên Node.js hoặc Bun qua addon napi-rs. - Dear ImGui 1.93: chạy nguyên bản, mọi hàm trong
imgui.hđều dùng được, kể cảShowDemoWindow(), từ C++, C, Python và Rust. - C/C++: API chỉ một tệp header
BUI_kit.h, mỗi hàm kèm một dòng chú thích.
Cú pháp Qt hiện chỉ là một phần — khoảng 24% số tên phương thức trên các lớp widget chính; phần thiếu sẽ báo AttributeError. Tác giả cũng ghi rõ MyGo nằm ở trạng thái "sắp có".
Hiệu năng: điểm nhấn của dự án
BUI dùng damage rendering: mỗi thay đổi chỉ đánh dấu hình chữ nhật của widget đó là "bẩn", các vùng bẩn được gộp lại (tối đa 24 vùng mỗi cửa sổ), và nếu không có gì bẩn thì vòng lặp không vẽ mà ngủ chờ input hoặc hẹn giờ. Hệ quả là một cửa sổ để yên tốn 0% CPU, còn khi rê chuột chỉ widget bị chạm mới được vẽ lại.
Bộ render phần mềm so khung hình mới với khung trước theo lưới ô 64×32 và chỉ đẩy lên màn hình những ô thay đổi. Trên bản demo component đầy đủ, tác giả đo khoảng 0,7 ms cho một khung hình hoàn chỉnh và khoảng 0,05 ms cho khung hình khi rê chuột hoặc kéo số.
Bộ render GPU là tùy chọn: Direct3D 11 trên Windows, OpenGL 3.3 trên Linux, mô phỏng cách Blender vẽ widget theo instance. Theo phần benchmark trong README, BUI tốn ít hơn 2–4 lần CPU mỗi khung hình so với gpui-fast, dùng ít RAM hơn và có khung hình đầu tiên khoảng 5 ms.
Phần hình ảnh cũng đáng chú ý: một bộ giải mã duy nhất viết bằng C cho mọi ngôn ngữ, hỗ trợ PNG, GIF, BMP, TGA, QOI, JPEG, WebP (kể cả ảnh động), HDR, PNM và SVG, giải mã ngoài luồng UI và chỉ vẽ lại đúng vùng ảnh khi dữ liệu về.
Huy hiệu phiên bản gói React trên npm
Nền tảng và giới hạn cần biết
BUI tạo cửa sổ gốc trên Windows (Win32) và Linux (X11, Wayland qua XWayland), có host Cocoa thử nghiệm cho macOS chuyển từ mã GHOST của Blender. Hỗ trợ HiDPI theo từng màn hình trên Windows, Xft.dpi trên Linux và Retina trên macOS. Chế độ headless phục vụ kiểm thử và chụp ảnh màn hình.
Cài đặt: Python cần CPython 3.11 trở lên và chỉ cần pip install blenderui; Rust cần Rust 1.88 trở lên cùng CMake và trình biên dịch C; JavaScript cần Node.js 18+ hoặc Bun, gói npm dựng sẵn cho Windows x64 còn trên Linux phải build addon từ mã nguồn.
Một số giới hạn được nêu thẳng trong tài liệu: chưa có font fallback theo từng ký tự (ký tự thiếu hiện thành ô vuông), chưa hỗ trợ IME, văn bản phải-sang-trái mới chỉ đảo thứ tự chứ chưa định hình lại, và chưa có tính năng OpenType. Tác giả ghi cả hai việc font fallback và IME là "sắp có".
Góc nhìn
Với lập trình viên Việt Nam, giá trị thực dụng nhất của BUI nằm ở chỗ nó hạ thấp rào cản để có một giao diện desktop "cảm giác chuyên nghiệp" mà không phải chọn giữa webview nặng nề và toolkit cũ kỹ. Nếu bạn đang có công cụ nội bộ viết bằng tkinter, việc chạy lại qua blenderui-tk là bước thử nghiệm gần như không tốn công, còn nếu đang làm công cụ cho nghệ sĩ 3D hoặc nhóm quen Blender thì bộ component gốc giúp người dùng không phải học lại thao tác.
Tuy vậy, đây là dự án non trẻ do một tác giả dẫn dắt, và chính README thừa nhận thiếu IME cùng font fallback — hai điểm nhức nhối với người dùng gõ tiếng Việt có dấu. Do đó hướng hợp lý là thử nghiệm ở công cụ nội bộ, công cụ hỗ trợ pipeline hoặc prototype trước, thay vì đặt cược vào một sản phẩm thương mại cần gõ tiếng Việt mượt ngay từ ngày đầu.
Nguồn: github.com (bài gốc ngày 06 tháng 11, 2026) · Quy trình biên tập

