From f73564f67114f8698bb3682b999f5a7ce2401952 Mon Sep 17 00:00:00 2001 From: Piotr Wilkin Date: Sat, 11 Jul 2026 11:59:26 +0200 Subject: [PATCH 1/3] feat(trellis): per-request UV atlas method, bump trellis to v0.1.6 Forward an optional 'uv' field (xatlas|box) from /3d/generations to trellis-server and validate it before model load. v0.1.6 makes xatlas the default UV pass, adds occlusion-aware layered box projection, and fixes a Vulkan workgroup-count crash in the res-1024 cascade. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01EbpKMPt3rkoxTRJMaDwWXv --- docs/api/lemonade.md | 1 + src/cpp/resources/backend_versions.json | 6 +++--- src/cpp/server/backends/trellis/trellis_server.cpp | 3 +++ src/cpp/server/server.cpp | 6 ++++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/api/lemonade.md b/docs/api/lemonade.md index 0c1e336ed..5427b3804 100644 --- a/docs/api/lemonade.md +++ b/docs/api/lemonade.md @@ -772,6 +772,7 @@ This endpoint is not part of the OpenAI API, so it is a Lemonade-specific extens | `image` | Yes | Base64-encoded input image (optionally a `data:` URL). | | `resolution` | No | Cascade resolution: `512`, `1024`, or `1536`. Default: `512`. | | `bg_removal` | No | Background removal mode: `threshold` or `birefnet`. Use `birefnet` for photos with real backgrounds. | +| `uv` | No | UV atlas method: `xatlas` (default) or `box`. `xatlas` runs a full UV unwrap giving every face unique atlas space — best quality, but chart computation is superlinear in face count. `box` is a faster 6-plane projection with occlusion-aware bucket assignment and depth-tested rasterization; small texture artifacts remain possible in concave regions. | | `seed` | No | Random seed for reproducibility. | | `response_format` | No | Output encoding. Only formats the backend natively produces are accepted (currently `glb`); other values are rejected with `400 Bad Request`. Default: `glb`. | diff --git a/src/cpp/resources/backend_versions.json b/src/cpp/resources/backend_versions.json index 5f4dc0185..d476db1a1 100644 --- a/src/cpp/resources/backend_versions.json +++ b/src/cpp/resources/backend_versions.json @@ -122,9 +122,9 @@ "cuda": "v0.1.1" }, "trellis": { - "vulkan": "v0.1.5", - "rocm-stable": "v0.1.5", - "cuda": "v0.1.5" + "vulkan": "v0.1.6", + "rocm-stable": "v0.1.6", + "cuda": "v0.1.6" }, "openmoss": { "vulkan": "v0.1.2", diff --git a/src/cpp/server/backends/trellis/trellis_server.cpp b/src/cpp/server/backends/trellis/trellis_server.cpp index a0d55069b..72279fd02 100644 --- a/src/cpp/server/backends/trellis/trellis_server.cpp +++ b/src/cpp/server/backends/trellis/trellis_server.cpp @@ -183,6 +183,9 @@ void TrellisServer::model_3d_generations(const json& request, httplib::DataSink& if (request.contains("bg_removal") && request["bg_removal"].is_string()) { fields.push_back({"bg_removal", request["bg_removal"].get(), "", ""}); } + if (request.contains("uv") && request["uv"].is_string()) { + fields.push_back({"uv", request["uv"].get(), "", ""}); + } auto fail = [&sink](const std::string& message) { const std::string payload = diff --git a/src/cpp/server/server.cpp b/src/cpp/server/server.cpp index f2c4f3aec..8a20e0f3c 100644 --- a/src/cpp/server/server.cpp +++ b/src/cpp/server/server.cpp @@ -3502,6 +3502,12 @@ void Server::handle_3d_generations(const httplib::Request& req, httplib::Respons if (request_json.contains("seed") && !request_json["seed"].is_number_integer()) { return reject("'seed' must be an integer"); } + if (request_json.contains("uv")) { + const auto& u = request_json["uv"]; + if (!u.is_string() || (u != "box" && u != "xatlas")) { + return reject("'uv' must be 'box' or 'xatlas'"); + } + } std::string requested_model = request_json["model"]; try { From 976da46385f5c98b3b955540dda9cd87e29c344e Mon Sep 17 00:00:00 2001 From: Piotr Wilkin Date: Mon, 13 Jul 2026 07:44:02 +0200 Subject: [PATCH 2/3] chore(trellis): bump pin to v0.2.0 v0.2.0 lands the reference-parity postprocess (narrow-band DC remesh, reference charting/packing, Telea inpaint, WebP GLB textures) and the performance work; supersedes the anticipated v0.1.6. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_018Z9WMqprhqjWEDuv1gnGaH --- src/cpp/resources/backend_versions.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cpp/resources/backend_versions.json b/src/cpp/resources/backend_versions.json index d476db1a1..3add652aa 100644 --- a/src/cpp/resources/backend_versions.json +++ b/src/cpp/resources/backend_versions.json @@ -122,9 +122,9 @@ "cuda": "v0.1.1" }, "trellis": { - "vulkan": "v0.1.6", - "rocm-stable": "v0.1.6", - "cuda": "v0.1.6" + "vulkan": "v0.2.0", + "rocm-stable": "v0.2.0", + "cuda": "v0.2.0" }, "openmoss": { "vulkan": "v0.1.2", From eb5a4af5cc169ddead050f9b198406116905cf95 Mon Sep 17 00:00:00 2001 From: Piotr Wilkin Date: Mon, 13 Jul 2026 09:25:55 +0200 Subject: [PATCH 3/3] chore(trellis): v0.2.1 (Windows build fix over v0.2.0) Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_018Z9WMqprhqjWEDuv1gnGaH --- src/cpp/resources/backend_versions.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cpp/resources/backend_versions.json b/src/cpp/resources/backend_versions.json index 3add652aa..1986d7ab3 100644 --- a/src/cpp/resources/backend_versions.json +++ b/src/cpp/resources/backend_versions.json @@ -122,9 +122,9 @@ "cuda": "v0.1.1" }, "trellis": { - "vulkan": "v0.2.0", - "rocm-stable": "v0.2.0", - "cuda": "v0.2.0" + "vulkan": "v0.2.1", + "rocm-stable": "v0.2.1", + "cuda": "v0.2.1" }, "openmoss": { "vulkan": "v0.1.2",