Skip to content

Commit 663a4e6

Browse files
ghirparaclaude
andcommitted
fix(render): correct camera selection in /render and /render/batch
The buildRenderScript() template called App.getViewportMgr(), which is undefined in this DAZ Studio version, causing every camera-targeted render to fail immediately with a TypeError. It also never set opts.camera (the property doRender() actually reads), so once the TypeError was fixed, renders completed without error but produced a black image. Switch to the verified MainWindow.getViewportMgr().getActiveViewport() .get3DViewport().setCamera() pattern already used by dazpy and this repo's own scripts, and set opts.camera alongside the viewport camera. Bump version to 2.7.0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent dcd8ab7 commit 663a4e6

5 files changed

Lines changed: 39 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22

33
All notable changes to DazScript Server are documented here.
44

5+
## [2.7.0] - Unreleased
6+
7+
### Fixed
8+
9+
- **`/render` camera selection** — the native render endpoint called
10+
`App.getViewportMgr()` when a `cameraName` was supplied, which is undefined
11+
in this DAZ Studio version and made every camera-targeted render fail
12+
immediately with a `TypeError`. Switched to `MainWindow.getViewportMgr()`,
13+
matching the pattern already used by `dazpy`'s own render/viewport helpers.
14+
- **`/render` black output with `cameraName`** — after the above fix, renders
15+
submitted with an explicit camera completed without error but produced a
16+
black image, because the render camera actually read by `doRender()` comes
17+
from `opts.camera`, not the viewport's active camera. The endpoint only
18+
updated the viewport (`setActiveCamera`) and never set `opts.camera`, so
19+
the renderer used a stale/null camera. Now sets both, matching
20+
`dazpy/_render.py` and this repo's own camera-preset scripts. Affects both
21+
`/render` and `/render/batch` (they share `buildRenderScript()`).
22+
523
## [2.6.0] - 2026-06-27
624

725
### Added

include/common_version.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
// Version number for DazScriptServer
55
#define DZSRV_MAJOR 2
6-
#define DZSRV_MINOR 6
6+
#define DZSRV_MINOR 7
77
#define DZSRV_REV 0
88
#define DZSRV_BUILD 0
99

1010
#define DZSRV_VERSION DZ_MAKE_VERSION( DZSRV_MAJOR, DZSRV_MINOR, DZSRV_REV, DZSRV_BUILD )
11-
#define DZSRV_VERSION_STR "2.6.0"
11+
#define DZSRV_VERSION_STR "2.7.0"

openapi.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ info:
2222
queue behind each other. The `/execute/async` family lets callers submit
2323
work without blocking their HTTP connection.
2424
25-
version: 2.6.0
25+
version: 2.7.0
2626
contact:
2727
name: Blue Moon Foundry
2828
url: https://github.com/bluemoonfoundry/daz-script-server/issues
@@ -64,7 +64,7 @@ paths:
6464
$ref: '#/components/schemas/StatusResponse'
6565
example:
6666
running: true
67-
version: "2.6.0"
67+
version: "2.7.0"
6868

6969
/health:
7070
get:
@@ -81,7 +81,7 @@ paths:
8181
$ref: '#/components/schemas/HealthResponse'
8282
example:
8383
status: ok
84-
version: "2.6.0"
84+
version: "2.7.0"
8585
running: true
8686
auth_enabled: true
8787
active_requests: 2

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "dazpy"
7-
version = "2.6.0"
7+
version = "2.7.0"
88
description = "Python SDK for the DAZ Studio Script Server"
99
readme = "README.md"
1010
requires-python = ">=3.10"

src/DzScriptServerPane.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,7 +1876,15 @@ static QString buildRenderScript(
18761876
// renderImgToId Q_PROPERTY WRITE setRenderImgToId (2 = DirectToFile)
18771877
// imageSize Q_PROPERTY WRITE setImageSize (QSize)
18781878
// Scene.findCameraByLabel() confirmed in dzscene.h
1879-
// App.getViewportMgr().setActiveCamera() confirmed in dzviewportmgr.h
1879+
// MainWindow.getViewportMgr().getActiveViewport().get3DViewport().setCamera()
1880+
// is the verified viewport-camera setter (see dazpy/_viewport.py,
1881+
// vangard_daz_mcp/_registry.py's _SET_ACTIVE_CAMERA_SCRIPT). Neither
1882+
// App.getViewportMgr() nor DzViewportMgr.setActiveCamera() exist on this
1883+
// DAZ Studio version — both throw TypeError; don't reintroduce them.
1884+
// opts.camera is the property doRender() actually reads to pick the render
1885+
// camera — setting only the viewport's active camera leaves this stale/null
1886+
// and produces a black render. Must set both (see dazpy/_render.py, and
1887+
// vangard_daz_mcp/_registry.py's camera-preset/render scripts).
18801888
// renderMgr.doRender(opts) confirmed in dzrendermgr.h
18811889
// Engine switching: renderMgr.setActiveRenderer(DzRenderer*) — requires
18821890
// renderer lookup by class name; names are runtime-registered so not in
@@ -1897,7 +1905,12 @@ static QString buildRenderScript(
18971905
script +=
18981906
" if (cameraName) {\n"
18991907
" var cam = Scene.findCameraByLabel(cameraName);\n"
1900-
" if (cam) App.getViewportMgr().setActiveCamera(cam);\n"
1908+
" if (cam) {\n"
1909+
" opts.camera = cam;\n"
1910+
" var viewportMgr = MainWindow.getViewportMgr();\n"
1911+
" var activeViewport = viewportMgr ? viewportMgr.getActiveViewport() : null;\n"
1912+
" if (activeViewport) activeViewport.get3DViewport().setCamera(cam);\n"
1913+
" }\n"
19011914
" }\n";
19021915

19031916
// Engine class name map — confirmed: iray="DzIrayRenderer".

0 commit comments

Comments
 (0)