Changes in S24

Changes in S24.111

Cinema 4D Service Pack 1, did not break teh API compatibility.

Flags maxon::NORMALIZEFLAGS::UNDERLYING and maxon::NORMALIZEFLAGS::UNDERLYING_RECURSIVE are added to resolve url like asset:///file_6caeb7bfe9b9e52f~.exr to there real location.

maxon::Url url = maxon::Url("asset:///file_6caeb7bfe9b9e52f~.exr"_s);
// Return ramdisk://9AC22C47-8419-4BE8-A25A-7080AFFC4607/file_6caeb7bfe9b9e52f/1/asset.exr
// Return file:///D:/_assetcache7/MaxonAssets.db_928b00eb92960ced5a6625d0b21f7298/file_6caeb7bfe9b9e52f/1/asset.exr

See API Changes in S24.111 for the detailed list.

Changes in S24.111

Development Environment

  • Windows 10 and Visual Studio 2019.
  • MacOS 10.14 is necessary while MacOS 10.15 is the recommended version and Xcode 11 is required for intel plugins.
  • MacOS 10.15.6 or newer with Xcode 12 is required to build universal ARM plugins.

To support both Intel-based and ARM-based Apple hardware via universal binaries, see Universal Binaries.

S24 Compatibility with previous versions

Plugins built against previous versions are compatible with Cinema 4D S24. They require to be rebuild against the S24 API in only a few cases, as listed below.

  • A recompilation and a code adaptation is needed if the python.framework has been used. See Python Update for more information.
  • A recompilation and a code adaption will be needed if maxon::RamDiskInterface has been used or implemented. Usage is not compatible.
  • A recompilation and a code adaption will be needed if maxon::IoConnectionInterface has been implemented. Usage is compatible.
  • A recompilation and a code adaption will be needed if maxon::HierarchyObjectInterface has been implemented. Usage is compatible.

Node API

This release exposes Cinema 4D's Nodes API to the SDK, which will be essential for the future development of Cinema 4D.

Among other things, the Nodes API is capable of:

  • implementing custom user nodes,
  • providing an interface for a graph,
  • iterating over each node and port in a graph,
  • instantiating a node,
  • removing a node,
  • grouping nodes,
  • setting and getting a node property, and
  • retrieving the value of a port.

It is also capable of accessing, creating and editing assets for the new content browser, as well as:

  • implementing and using a custom NodeSpace, and
  • importing or exporting a node graph in dependency to a NodeSpace.
It is neither possible and nor planned to introduce the possibility for compiling and executing a custom graph node at the moment.

The entry points for nodes are either the NodeMaterial, or the BaseList2D through the BaseList2D::GetNimbusRef.

The NodeMaterial is a temporary class, introduced in order to provide access to the node system. In the future this class will be deprecated, as most of the use cases are covered by the BaseList2D and the maxon::NimbusBaseInterface.

There are multiple new frameworks to interact with the nodes system.

  • The asset.framework, containing APIs regarding repositories and assets.
  • The graph.framework, containing APIs providing tools for a simplified access to graphs.
  • The nodes.framework, containing APIs to use and implement custom user nodes independently of the corenodes.framework and to provide a copy-on-write data container (NodeSystem) for a graph-like structure.
  • nodespaces.framework, containing APIs to use and implement a collection of NodeSystem instances.
  • exchange.framework, containing APIs to define custom behaviors for nodal materials during import and export operations and the viewport representation of a nodal material.

Manuals are available in the Node section.

Examples are available in the "example.nodes" folder, bundled with the file included in every distribution of Cinema 4D.

Python Update

In Python 3.7.7, it was okay to initialize a PythonType with PyType_Ready() after it has been inserted into a module with PyModule_AddObject(). In Python 3.9.1 this is not accepted anymore and there is a new method called PyModule_AddType(). Which will call PyType_Ready() and then PyModule_AddObject().

Many includes and variables used the Python37 or Py37 prefix. It has been changed to Python3/Py3.
This makes the python.framework more future proof and will not require an API break each time the Python version is updated.

See the complete change log of the python.framework.


Various changes

Documentation Fixes

  • Fixed ObjectData::CheckDirty which claimed only being called for deformers. It does work for all types of ObjectData.
  • Fixed ObjectData::GetContour which claimed it could return an empty Null BaseObject when wanting to return nothing. An empty SplineObject should be returned instead.
  • Improved the documentation of SetActiveDocument with information about the need for the passed document to be already in the Cinema 4D document list.
  • Improved the documentation of GeDialog::AddColorChooser, by marking the setting argument private, since it has no third party use case.
  • Added section in the Code Style Guide documentation for namespace, see 7.15 Namespace.

See API Changes in S24.034 for the detailed list.

Resolve Url to underlying Url if possible recursive for all levels. E.g., an asset Url might get reso...
Definition: ioenums.h:10
Definition: url.h:856
Resolve Url to underlying Url if possible for 1 level. E.g., an asset Url might get resolved to a fil...