Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

All notable changes to DazScript Server are documented here.

## [2.8.1] - 2026-07-24

### Truthful Iray/Viewport render-engine selector

`DazRenderSettings.render_engine_state()` reads `DzRenderOptions.renderType`
and the active renderer class/name as separate facts, returning a schema-1
record with a normalized `verified_iray` / `verified_non_iray` /
`unavailable` status and field-level live-readback provenance. A retained
`NVIDIA Iray` active-renderer name never overrides a Viewport/OpenGL
`renderType`.

`DazRenderSettings.set_render_engine("iray" | "viewport")` is an explicit
persistent setter that selects the registered `DzIrayRenderer` plus
`Software` for Iray, or `ScreenShot` for Viewport, applies the change, and
returns only after exact readback. Missing renderers, mutation/apply
faults, malformed replies, and readback disagreement raise `RenderError`;
unknown engine names raise `ValueError` before dispatch.

The `engine` field on `/render`, `/render/batch`, and `/render/animation`
also accepts `viewport` and uses the same fail-closed mutation/readback
rules.

## [2.8.0] - 2026-07-23

DAZ Studio's Qt main thread is single-threaded: if a user drives DAZ Studio
Expand Down
41 changes: 39 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# DazScript Server

**Version 2.8.0** | DAZ Studio 4.5+ | DAZ Studio 6.25+ | Windows & macOS
**Version 2.8.1** | DAZ Studio 4.5+ | DAZ Studio 6.25+ | Windows & macOS

[![Docs](https://img.shields.io/badge/docs-dazpy%20SDK-blue)](https://bluemoonfoundry.github.io/daz-script-server/)
[![HTTP API](https://img.shields.io/badge/docs-HTTP%20API%20reference-blue)](https://bluemoonfoundry.github.io/daz-script-server/api-reference/)
Expand Down Expand Up @@ -68,6 +68,7 @@ print(response.json())
### Getting Started
- [Quick Start](#-quick-start)
- [Why This Exists](#why-this-exists)
- [What's New in v2.8.1](#whats-new-in-v281)
- [What's New in v2.8.0](#whats-new-in-v280)
- [What's New in v2.7.2](#whats-new-in-v272)
- [What's New in v2.7.1](#whats-new-in-v271)
Expand Down Expand Up @@ -155,6 +156,42 @@ DAZ Studio is powerful for 3D content creation, but automation is limited to man

---

## What's New in v2.8.1

### Truthful Iray/Viewport render-engine selector

`DazRenderSettings.render_engine_state()` now reads the effective
`DzRenderOptions.renderType` value and the active renderer class/name as separate
facts. Its schema-1 record includes the raw enum value/name, normalized
`verified_iray` / `verified_non_iray` / `unavailable` status, and field-level
live-readback provenance. A retained `NVIDIA Iray` active-renderer name never
overrides a Viewport/OpenGL `renderType`.

`DazRenderSettings.set_render_engine("iray" | "viewport")` is an explicit
persistent setter. It selects the registered `DzIrayRenderer` plus `Software` for
Iray, or `ScreenShot` for Viewport, calls `applyChanges()`, and returns only after
exact readback. Missing renderers, mutation/apply faults, malformed replies, and
readback disagreement raise `RenderError`; unknown engine names raise `ValueError`
before dispatch.

```python
settings = DazRenderSettings(client)
before = settings.render_engine_state()
change = settings.set_render_engine("iray")
assert change["readback"]["status"] == "verified_iray"
```

The `engine` field on `/render`, `/render/batch`, and `/render/animation` also
accepts `viewport` and uses the same fail-closed mutation/readback rules. These
operations intentionally persist the requested engine. DAZ documents `ScreenShot`
and `HardwareAssisted` as Viewport/OpenGL operations and `Software` as the active
software-renderer operation in the
[DzRenderOptions reference](https://docs.daz3d.com/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/renderoptions_dz);
renderer lookup and activation are documented by
[DzRenderMgr](https://docs.daz3d.com/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/rendermgr_dz).

---

## What's New in v2.8.0

### 🚦 Fail Fast When DAZ Studio Is Busy — `503 STUDIO_BUSY`
Expand Down Expand Up @@ -697,7 +734,7 @@ automation code without authoring DazScript by hand.
Download the `.whl` file from the [latest release](https://github.com/bluemoonfoundry/daz-script-server/releases/latest) and install it:

```bash
pip install dazpy-2.8.0-py3-none-any.whl
pip install dazpy-2.8.1-py3-none-any.whl
```

Or install directly from the repo for development:
Expand Down
2 changes: 1 addition & 1 deletion dazpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
figure.find_bone("r_forearm").set_local_rotation(0, 0, 45)
"""

__version__ = "2.8.0"
__version__ = "2.8.1"

from ._client import DazClient
from ._scene import DazScene
Expand Down
3 changes: 1 addition & 2 deletions dazpy/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,14 +507,13 @@ def render_animation_submit(
width: Image width in pixels (must be paired with *height*).
height: Image height in pixels (must be paired with *width*).
camera: Camera label to render from.


engine: Render engine (``"iray"``, ``"viewport"``, ``"filament"``).
retry_on_busy: If ``True``, transparently retry with backoff when
the server reports ``StudioBusyError``/``ConcurrencyLimitError``,
instead of raising immediately.
max_wait: Maximum total seconds to retry when *retry_on_busy* is
``True``, before re-raising the busy error.

Returns:
A dict with ``request_id``, ``status`` (``"queued"``), and
``submitted_at`` keys.
Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
project = "dazpy"
copyright = "2024, Blue Moon Foundry"
author = "Blue Moon Foundry"
release = "2.8.0"
release = "2.8.1"
version = release

# ── Extensions ────────────────────────────────────────────────────────────────
Expand Down
4 changes: 2 additions & 2 deletions include/common_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
// Version number for DazScriptServer
#define DZSRV_MAJOR 2
#define DZSRV_MINOR 8
#define DZSRV_REV 0
#define DZSRV_REV 1
#define DZSRV_BUILD 0

#define DZSRV_VERSION DZ_MAKE_VERSION( DZSRV_MAJOR, DZSRV_MINOR, DZSRV_REV, DZSRV_BUILD )
#define DZSRV_VERSION_STR "2.8.0"
#define DZSRV_VERSION_STR "2.8.1"
6 changes: 3 additions & 3 deletions openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ info:
queue behind each other. The `/execute/async` family lets callers submit
work without blocking their HTTP connection.

version: 2.8.0
version: 2.8.1
contact:
name: Blue Moon Foundry
url: https://github.com/bluemoonfoundry/daz-script-server/issues
Expand Down Expand Up @@ -64,7 +64,7 @@ paths:
$ref: '#/components/schemas/StatusResponse'
example:
running: true
version: "2.8.0"
version: "2.8.1"

/health:
get:
Expand All @@ -81,7 +81,7 @@ paths:
$ref: '#/components/schemas/HealthResponse'
example:
status: ok
version: "2.8.0"
version: "2.8.1"
running: true
auth_enabled: true
active_requests: 2
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "dazpy"
version = "2.8.0"
version = "2.8.1"
description = "Python SDK for the DAZ Studio Script Server"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
Loading