Everything here was read from the source on branch claude-automation of S:\_modding\tools\DSAnimStudio.
Locations
| What |
Where |
| Source |
S:\_modding\tools\DSAnimStudio, branch claude-automation (uncommitted edits on upstream v5-rc6.1) |
| Batch mode code |
DSAnimStudioNETCore\DSASAutomation.cs |
| Build |
dotnet build DSAnimStudioNETCore\DSAnimStudioNETCore.csproj -c Release (target net9.0-windows7.0, assembly name DS ANIM STUDIO) |
| Built exe |
DSAnimStudioNETCore\bin\Release\net9.0-windows7.0\DS ANIM STUDIO.exe |
| Other copies |
install\DS ANIM STUDIO.exe is what run-dsas.bat starts. install-auto\ is a second copy. Whether either has the fork's changes was not checked: use the build output above for --auto. |
Command line
| Argument |
Meaning |
--auto <job.json> |
Batch mode. Reads the job, opens the character, captures, exits. |
--use-workspace |
Skip the folder picker when _DSAS_WORKSPACE.json exists next to the opened file and has a GameDirectory. |
dsas://open?... |
Open a file at startup. See Browse ports interactively. |
Job file fields
JSON. Field names are not case-sensitive.
Core
| Field |
Type |
Default |
Meaning |
ani |
string |
none, needed |
Path of the anibnd. |
chr |
string |
none, needed |
Path of the chrbnd. |
out |
string |
none, needed |
Output folder. Created if missing. Gets the PNGs and auto.log. |
anims |
list of numbers |
[] |
Full animation ids. Empty = one capture, loaded.png. |
times |
list of numbers |
[0] |
Seconds into each animation. Every animation is captured at every time. |
settleFrames |
number |
30 |
Frames to wait after load, after an animation change and after a scrub. |
openTimeoutFrames |
number |
6000 |
Frames to wait for the load before giving up. |
exit |
bool |
true |
Close DSAS when done (a hard exit, no save prompt). |
width |
number |
1280 |
Capture width in pixels. |
height |
number |
720 |
Capture height in pixels. |
View and camera
| Field |
Type |
Default |
Meaning |
hideHelpers |
bool |
false |
Hide the grid, all helper shapes (bones, dummy polys, root motion markers, hit capsules) and the camera pivot box. |
background |
[r, g, b], 0-255 |
none |
Viewport colour. Also turns the skybox off. |
autoFrame |
bool |
false |
Fit the camera to the drawn model. Needs a flat background. |
margin |
number |
0.06 |
With autoFrame: share of the view kept free on each side. |
yaw |
number |
0 |
With autoFrame: degrees around the model. |
pitch |
number |
0 |
With autoFrame: degrees of tilt. |
frameIterations |
number |
10 |
With autoFrame: fitting steps before it settles for the current frame. |
zoom |
number |
1.0 |
After fitting: multiplies the camera distance (0.4 = 2.5 times closer). |
panX, panY |
number |
0 |
After fitting: move the view centre by a fraction of the view (panY above 0 = up, panX above 0 = right). |
fov |
number |
0 |
Vertical field of view in degrees. 0 = the viewer's own. |
camCenter |
[x, y, z] |
none |
With autoFrame and camDist: skip fitting and use this centre. |
camDist |
number |
0 |
With autoFrame and camCenter: the fixed camera distance. |
Lighting
All optional. Left out = as DSAS is configured.
| Field |
Type |
Meaning |
sceneBrightness |
number |
Scene brightness. |
directLight |
number |
Direct light multiplier. |
indirectLight |
number |
Indirect light multiplier. |
ambientLight |
number |
Ambient light multiplier. |
contrast |
number |
Scene contrast. |
ssaa |
whole number |
Supersampling factor. |
Hiding things
| Field |
Type |
Meaning |
showMasks |
list of numbers |
Only these model mask indices are drawn. Unmasked materials are always drawn. [] hides every masked part. |
hideMasks |
list of numbers |
These mask indices are hidden. Wins over showMasks. |
hideMaterials |
list of strings |
Hide every submesh whose full material name contains one of these (case-insensitive). |
hideSubmeshes |
list of numbers or strings |
A number hides that submesh index of the base model. A string "part:index" hides a submesh of a c0000 part model. |
hideParts |
list of strings |
c0000 only: hide whole part models by slot name or part file name. |
Part names for hideSubmeshes and hideParts: the slot name (Head, Body, Arms, Legs, RightWeapon#0 to
RightWeapon#3, and the same for LeftWeapon) or the part file name (for example bd_m_9948). RightWeapon without
# matches all four. The PART lines of auto.log list them.
c0000 (human) only
| Field |
Type |
Meaning |
equip |
object, slot name to row id |
Armour slots (Head, Body, Arms, Legs) take an EquipParamProtector row. RightWeapon and LeftWeapon take an EquipParamWeapon row. Rows are read from the regulation of ModEngineDirectory. |
remapMode |
string |
How part skeletons follow the body: DirectBoneMap, DirectFKOrientationOnly, RetargetRelative or RetargetRelativeAndDirectFKOrientation. Left out = the game's default. |
Outputs
| File |
When |
<out>\a<anim id, 9 digits>_t<time, 3 decimals>.png |
One per animation and time. |
<out>\loaded.png |
When anims is empty. |
<out>\auto.log |
Always. Overwritten on each run. |
auto.log categories: AUTO, MESH, SLOT, PART, DIALOG, NOTIF/<type>, plus DSAS's own error log categories.
_DSAS_WORKSPACE.json
Lives in the same folder as the opened anibnd.
| Field |
Default |
Meaning |
GameDirectory |
none |
The game's Game folder. |
ModEngineDirectory |
none |
The mod folder. Files are looked up here first. |
LoadLooseParams |
false |
Read loose param files. |
LoadUnpackedGameFiles |
false |
Read an unpacked game folder. |
DisableInterrootDCX |
false |
DSAS's own switch; left as is. |
WorldViews |
one "Default" view |
Saved camera views. DSAS fills it in. |
What the fork changes in DSAS
From the working-tree diff against upstream:
--auto is started from Main.cs; the automation ticks every update and captures right after the 3D scene is drawn,
before any UI.
- In batch mode the splash, the Welcome window, the folder picker and the model override prompt are skipped, and native
dialogs are logged and closed by a watchdog thread.
- With
--auto on the command line, ImGui gets no ini file and the config save returns early, so a batch run never
changes the user's layout.
- In batch mode the 3D view has a fixed size (
width x height) and DSAS counts as focused, so it keeps updating.
- In batch mode, loose
material\matbin\<name>.matbin files of the mod folder are read when a material is not in the
material binder.
--use-workspace (see above).
- The start camera for a character fits the narrower viewport side with a 1.6 margin. This one also applies to normal use.