The documentation for the diffeomorphism add-ons are now available as pdf files, which can be used offline. All internal links have been removed because I didn't manage to make them work, but external links are fine.
DAZ Importer:
https://www.dropbox.com/scl/fi/p3dkh2zci2ffda8w4wkts/import_daz_wiki.pdf?rlkey=awngxzow98xrcmxaxph9he8l8&st=8r05k9e6
MHX Runtime System:
https://www.dropbox.com/scl/fi/l2d628xbkci8lkbxdl7tq/mhx_rts_wiki.pdf?rlkey=evuhhcwlv802lgvq5tly4gpy6&st=1srj059w
BVH and FBX Retargeter:
https://www.dropbox.com/scl/fi/vwu6qatiq1vtscf7508eb/retarget_bvh_wiki.pdf?rlkey=a4923d1kcm1qanxga9tu1vbxn&st=vagjam9z
Monday, April 14, 2025
Documentation as PDF Files
Sunday, April 6, 2025
Diffeomorphic Add-ons Version 4.4.0 Released
Version 4.4.0 of the DAZ Importer, MHX Runtime System, and FBX and BVH Retargeter have been released. They can be downloaded from
- DAZ Importer: https://www.dropbox.com/scl/fi/ikl7ewt2vyry4yokmexee/import_daz-4.4.0.zip?rlkey=6icungsgz5e2jf1xrfp4tu6a1
- MHX Runtime System: https://www.dropbox.com/scl/fi/wr5pe0azugvoqwx071uy1/mhx_rts-4.4.0.zip?rlkey=yj839xajudf5rzeuln9l4u1vi
- BVH and FBX Retargeter: https://www.dropbox.com/scl/fi/jp7t4j6q9r00y0b7ufhxx/retarget_bvh-4.4.0.zip?rlkey=aecabc76pafykzqh54m9d6y1v&st=ap5ywyda
The previous stable version 4.3.0 does not work with Blender 4.4 due to an API change.
Apart from working with Blender 4.4, there are also many bugfixes and some other changes.
- Internal data used by the DAZ Importer have been moved to a single complex property, to avoid unnecessary cluttering of the custom properties (http://diffeomorphic.blogspot.com/2025/01/custom-properties-cleanup.html).
- Improvements to Rigify, both for animals (https://bitbucket.org/Diffeomorphic/import_daz/issues/2350/implement-rigify-conversion-for-daz-dog) and adding extra Rigify bones (http://diffeomorphic.blogspot.com/2025/02/adding-extra-bones-to-rigify.html)
- Scripting improvements (http://diffeomorphic.blogspot.com/2025/03/scripting-improvements.html)
Wednesday, March 19, 2025
Scripting Improvements
Assume that we want to import a figure with Easy Import. We select the duf file (or the corresponding .png or .tip.png file) and press Easy Import DAZ. To do the same thing programatically, we could expect that the following script would work:
bpy.ops.daz.easy_import_daz(
filepath = "D:/home/scenes/victoria-rocker.duf"
)
However, nothing is imported. The reason is that the Easy Import tool can import several files at once. If we select the following three files, three different figures will be imported at once.
The old way to import multiple files uses the api.set_selection function, which needs to be called before easy_import_daz is invoked. Functions defined by the DAZ Importer plugin are documented here.
import bpy
from bl_ext.user_default.import_daz import api
api.set_selection([
"D:/home/scenes/aiko-basic-wear.duf",
"D:/home/scenes/victoria-rocker.duf",
"D:/home/scenes/michael-basic-wear.duf"])
bpy.ops.daz.easy_import_daz()
Unfortunately, this does not work very well. Under the hood the set_selection function sets a global variable, and this leads to complications for operators that invoke other operators, like easy_import_daz does. Recently I learned from Rakete that there is another way to access multiple files which does not involve any global variables.
When a file selector exists, it sets two keyword arguments: the StringProperty "directory" and the CollectionProperty "files". An alternative way to import multiple files is like this:
bpy.ops.daz.easy_import_daz(
directory = "D:/home/scenes",
files = [{"name" : "aiko-basic-wear.duf"},
{"name" : "victoria-rocker.duf"},
{"name" : "michael-basic-wear.duf"}])
Actually, importing files in this way has always worked, but I was not aware of it. The "files" argument is a bit complicated; it is a list of dicts with the "name" keyword, which is how we specify a CollectionProperty in scripts.
To import a single file we simply let "files" be a list with a single argument.
bpy.ops.daz.easy_import_daz(
directory = "D:/home/scenes",
files = [{"name" : "victoria-rocker.duf"}])
This way of importing multiple files is not limited to Easy Import. The following script imports three poses to the active object. The second line turns on automatic keying.
import bpy
bpy.context.scene.tool_settings.use_keyframe_insert_auto = True
folder = "/people/genesis 8 female/poses/base poses/"
files = ["base pose kneeling a.duf",
"base pose kneeling b.duf",
"base pose kneeling c.duf"]
bpy.ops.daz.import_pose(
directory = api.get_absolute_path(folder),
files = [{"name" : file} for file in files],
)
This script imports three poses to consequtive frames.
The following script import three units morphs:
files = ["eCTRLEyesClosed.dsf",
"eCTRLEyesClosedL.dsf",
"eCTRLEyesClosedR.dsf"]
bpy.ops.daz.import_units(
selection = [{"name" : file} for file in files]
)
It is thus equivalent to the following selection in the Import Units dialog.
If the "selection" keywprd is omitted, or equivalently if selection = [], all elements are selected. Thus the line
bpy.ops.daz.import_visemes()
imports all available viseme morphs. We can then set the corresponding rig properties.
rig = bpy.context.object
rig["eCTRLvAA"] = 1.0
rig["eCTRLvOW"] = 0.4
Thursday, March 6, 2025
Mathjax Test
If you use Firefox with NoScript, as I do, you need to whitelist jsdelivr.net and polyfill.io, otherwise only the uncompiled LaTex code will show up.
If anybody wonders, this is the Virasoro-like extension of the diffeomorphism algebra in multiple dimensions. e.g. on the
When I started this blog almost a decade ago I had planned to write about this and how it in my opinion fits into physics, hence the name of the blog. I never got around to do that, but that might change in the future.
Tuesday, February 25, 2025
Adding Extra Bones to Rigify
Here we have a figure with a rigged ponytail. The ponytail bones belong to the Custom collection.,
And here the rig has been converted to Rigify, with the hair bones still in the Custom collection. Posing each of hair bone individually can be done but is inconvenient.There are a few things that we can do to make it easier to pose the ponytail.
We can Add IK Goals. This tool is located in the Rigging > Chains panel which requires that the Rigging Tools feature is enabled.
However, Rigify is a modular rigging system and we may want to use some of the Rigify types. Previously that has not been so easy to do. In principle we can first generate the metarig, then add the custom bones to it, and finally rigify the modified metarig. However, that requires further postprocessing because the vertex groups must be renamed. In the last version of the DAZ Importer there is a much simpler way. Just select a bone in the original DAZ rig and add a Rigify type to it.

Wednesday, February 12, 2025
MHX Properties are now ID Properties
As discussed in the post on Custom Properties Cleanup, custom properties used by the DAZ Importer are now combined into a single, complex property. However, there are two exceptions:
- Morph properties, because they are part of a web of drivers that would not be evaluated in the correct order if they were parts of a complex property.
- Properties that need to work when the add-on is disabled, e.g. at a render farm.
The custom properties used by the MHX rig belong to the second category.
There are two types of custom properties in Blender:RNA properties and ID properties, or properties that are defined by the system or by add-ons and those that are created on the fly. The problem with RNA properties is that they do not work properly if the add-on is disabled. MHX properties have nevertheless been implemented as RNA properties, because ID properties did not worked with file linking in some earlier version of Blender. This problem has been fixed in recent Blender versions, and therefore there is no reason to use RNA properties anymore.
This change should be backwards compatible, almost. Even if the MHX rig was created in an earlier version of the DAZ Importer, where the MHX properties were RNA properties, it should still function correctly with the latest version. This works because RNA properties are automatically converted to ID properties if the API no longer defines them. The only thing that does not work is animations with dynamic FK/IK switching.
Pressing the cogwheel brings up the Edit Property window. Note that MHX properties are Library Overridable at the bottom of the window.
Save the scene with the MHX rig, open a new file, and link the collection with the MHX character into the new scene. To make the character useful in the new scene, choose Object > Library Override > Make.We can still access the custom properties, but they can not be edited. When we change a linked property it turns green.Now do the following steps:- Create an animation and save the file.
- Disable the DAZ Importer and MHX RTS add-ons.
- Restart Blender.
We have now recreated the situation at a render farm, where the DAZ Importer and MHX RTS are not available. Nevertheless the animation works correctly, including the animation of custom properties needed e.g. for FK/IK switching.
Sunday, January 26, 2025
Custom Properties Cleanup
The DAZ Importer creates lots of custom properties when a character is imported. These properties contain information from the duf file which is necessary for the proper function of other tools.
Care has been taken to make this change backward compatible, so old files should still work without modification. However, it is not forward compatible, so figures imported with the latest version will not work propertly in older versions of the DAZ Importer.
The MHX rig does not work by default if the MHX runtime system is disabled. The reason is that MHX uses RNA properties rather than ID properties, for reasons explained here. To make it work at a render farm the file properties.py in the runtime folder must be saved with the blend file, in the same way as the file morph_armature.py must be loaded to make morping armatures work without the DAZ Importer. This is inconvenient and I intend to replace MHX RNA properties by ID properties in the future.
Finally, there is an important type of custom properties that must be simple propertes: morphs. In Blender morphs are implemented as object and armature properties that drive bone rotations, shapekeys and other properties. Morph properties can not be part of a single, complex property. That would slow down the evaluation of morphs, which already can take excessive time if many morphs are loaded. Even more importantly, it wouldn't work at all, because the morphs might evaluated in the wrong order.
Morph properties are connected with a complex web of drivers, and it is crucial that the morphs are evaluated in the right order. This is guaranteed if the morph properties are simple properties.. There would be no such guarantee if they were parts of a complex property, and in fact that is not always the case. Besides, the morphs should work if the DAZ Importer is not enabled, otherwise we would end up with ugly faces.
So unfortunately the add-on is still flooding the custom properties if a figure has many morphs. I don't see any way around that.