SDK Change Notes for Cinema 4D 2023.1

Summarizes the API and API documentation changes made between Cinema 4D versions 2023.0.0 and 2023.1.0.

Overview

For an an overview of the required development environment for this release on Windows, MacOS, or Linux, see Development Environments.

Major Changes

Updated
The OpenColorIO (OCIO) API exposure has been finalized. Not yet included is the ability to access the raw OCIO profiles associated with a BaseDocument instance. This feature will be added with 2023.2.0.
Added
Added Color Management Manual : Convert color data between color spaces and color formats provided by the maxon API or loaded from disk.
Added
Added OpenColorIO Manual : Convert colors with the color profiles provided by the OpenColorIO (OCIO) configuration of a scene.
Added
Added the examples.image example to the Extended SDK on GitHub.

Minor Changes

Updated
The manner in which assets are being referenced in the maxon::URLSCHEME_ASSET scheme has changed. The older referencing scheme is still functional for referencing assets but the new scheme improves error messages for non-resolving asset URLs. See maxon::URLSCHEME_ASSET for details.
Updated
Updated the maxon::UrlScheme documentation for the maxon::UrlInterface type. Missing schemes will be added with 2023.2 to url.h .
Updated
Updated the BaseShader Manual in the Access and Structure section to clarify the structure of nested shaders.
Updated
Updated the Development for macOS manual to more precisely define the steps required for building under more recent versions of macOS and Xcode.

API Changes

Summarizes the technical changes made to the public APIs of Cinema 4D within the scope of these change notes.

asset.framework

Added:
New file for CommandAssetInterface and its metadata attributes.
const char const char const char * file
Definition: object.h:439
Added:
static MAXON_METHOD Result<LiteralId> HasKeyword(const AssetDescription& target, const Id& keywordId);
#define MAXON_METHOD
Definition: interfacebase.h:1001

cinema.framework

Added:
#define FILENAME_HELPSTRING 10006
#define TREEVIEW_NO_ENTER_FORWARD 'noef'
Added:
static void CopyLinearWorkflow(const BaseDocument *src, BaseDocument *previewDocument);
Definition: c4d_basedocument.h:498
PyObject * src
Definition: abstract.h:305
Added:
Message struct for some message types.
Definition: lib_description.h:844
Definition: lib_description.h:993
Added:
enum class CONVERSION_FLAGS
CONVERSION_FLAGS
Definition: datatypebase.h:62
Added:
maxon::Result<GeData> GetOverrideParam(const DescID& pIdx) const;
maxon::Result<void> SetOverrideParam(const DescID& pIdx, const GeData& d);
Definition: lib_description.h:330
Definition: c4d_gedata.h:83
Definition: resultbase.h:766
Added:
New file for symmetry generator object.
Added:
@ ID_VOLUMESEQUENCE_FIXEDCACHE
Definition: ovolumesequence.h:19
Added:
@ HAIR_SDYNAMICS_PBD_FORCES_INEX_PYRO
Definition: thairsplinedynamics.h:100
Added:
MDATA_CLOSEHOLE_BASIC_POLYTYPE = 1113 // LONG CYCLE
@ MDATA_CLOSEHOLE_BASIC_POLYTYPE
Definition: toolclosehole.h:25
@ MDATA_CLOSEHOLE_POLYTYPE_BASIC
Definition: toolclosehole.h:16
@ MDATA_CLOSEHOLE_WIDTH_OFFSET
Definition: toolclosehole.h:24
@ MDATA_CLOSEHOLE_ROTATION_OFFSET
Definition: toolclosehole.h:23
@ MDATA_CLOSEHOLE_CLOSEALLBTN
Definition: toolclosehole.h:26
@ MDATA_CLOSEHOLE_CLOSEALLHOLES
Definition: toolclosehole.h:27
@ MDATA_CLOSEHOLE_POLYTYPE_PATCH
Definition: toolclosehole.h:15
Added:
@ MDATA_FLATTEN_USEAXISPOSITION
Definition: toolflatten.h:22
Added:
@ PBD_CONSTRAINT_TAG_TEAR_MODE_ABSOLUTE
Definition: tpbdconstraint.h:27
@ PBD_CONSTRAINT_TAG_TEAR_MODE
Definition: tpbdconstraint.h:25
@ PBD_CONSTRAINT_TAG_TEAR_ABSOLUTE_DISTANCE
Definition: tpbdconstraint.h:28
@ PBD_CONSTRAINT_TAG_TEAR_MODE_RELATIVE
Definition: tpbdconstraint.h:26
Added:
@ PYRO_TAG_FUEL_INITIAL_CONTINGENT
Definition: tpyro.h:44
@ PYRO_TAG_SUBSTEP_MODE
Definition: tpyro.h:33
@ PYRO_TAG_FUEL_TYPE
Definition: tpyro.h:38
@ PYRO_TAG_DENSITY_ENABLED
Definition: tpyro.h:53
@ PYRO_TAG_FUEL_TARGET_FRAME
Definition: tpyro.h:43
@ PYRO_TAG_SURFACE_WEIGHTS_TEMPERATURE
Definition: tpyro.h:46
@ PYRO_TAG_FUEL_MATCH_BURNING_RATE
Definition: tpyro.h:52
@ PYRO_TAG_FUEL_GROUP
Definition: tpyro.h:47
@ PYRO_TAG_SUBSTEP_MODE_DISCRETE
Definition: tpyro.h:34
@ PYRO_TAG_VELOCITY_GROUP
Definition: tpyro.h:50
@ PYRO_TAG_FUEL_CONSTANT_PRESSURE
Definition: tpyro.h:55
@ PYRO_TAG_FUEL_TYPE_ONESHOT
Definition: tpyro.h:39
@ PYRO_TAG_FUEL_BURNING_RATE
Definition: tpyro.h:42
@ PYRO_TAG_FUEL_TYPE_CONTINUOUS
Definition: tpyro.h:41
@ PYRO_TAG_EMITTER_ENABLED
Definition: tpyro.h:36
@ PYRO_TAG_TEMPERATURE_GROUP
Definition: tpyro.h:48
@ PYRO_TAG_DENSITY_MIN
Definition: tpyro.h:51
@ PYRO_TAG_SUBSTEP_MODE_CONTINUOUS
Definition: tpyro.h:35
@ PYRO_TAG_SURFACE_WEIGHTS_FUEL
Definition: tpyro.h:45
@ PYRO_TAG_FUEL_TARGET_FRAME_END
Definition: tpyro.h:54
@ PYRO_TAG_DENSITY_GROUP
Definition: tpyro.h:49
@ PYRO_TAG_SURFACE_WEIGHTS_DENSITY
Definition: tpyro.h:37
@ PYRO_TAG_FUEL_TYPE_CONTINGENT
Definition: tpyro.h:40
@ PYRO_TAG_SUBSTEPS
Definition: tpyro.h:32
Added:
@ SLA_DIRTY_VMAP_TAG_NAME
Definition: xslavertexmap.h:9
Added:
const maxon::BaseArray<maxon::CString>& GetOcioColorSpaceNames();
const maxon::BaseArray<maxon::CString>& GetOcioRenderingColorSpaceNames();
const maxon::BaseArray<maxon::CString>& GetOcioViewTransformNames();
const maxon::BaseArray<maxon::CString>& GetOcioDisplayColorSpaceNames();
void UpdateOcioColorSpaces();
Definition: basearray.h:412
Added:
#define MSG_DESCRIPTION_IMPEXPORT_VERIFY_FILENAME
Added:
maxon::Result<void> CreateDefaultGraph(const maxon::Id& spaceId)
maxon::Result<void> CreateEmptyGraph(const maxon::Id& spaceId)
Definition: apibaseid.h:253
Added:
#define PLUGINFLAG_INTERNAL (1 << 20)
Added:
Definition: c4d_baseselect.h:32
PyObject * other
Definition: dictobject.h:70
maxon::Bool Bool
Definition: ge_sys_math.h:55
MAXON_ATTRIBUTE_FORCE_INLINE Bool IsEqual(PREDICATE &&predicate, const T1 &a, const T2 &b)
Definition: collection.h:102
Added:
#define TAG_VARIABLEFIELD (1 << 9)
Added:
maxon::UniqueHash GetDataHash(void) const;
Definition: hash.h:169
Added:
TAG_ADDEDTOCACHE
Tag was added to cache objects.
Definition: ge_prepass.h:118
FORBID_COLOR_CONVERSION
Don't do OCIO color conversion.
Definition: ge_prepass.h:117
Added:
#define Osymmetrygenerator 1060011
#define Opyro 1059580
#define Tgeneric 431000047
#define Tpyro 1059387
#define WPREF_MATMANAGER_DEFAULT_MATERIAL_AUTO 1059942
Added:
New enumeration that describes vector volume types.
Old:
maxon::Result<void> Init(BaseDocument* doc, const maxon::CString& inputColorSpaceLowName, const maxon::CString& inputColorSpaceHighName, const maxon::CString& renderColorSpaceName);
Definition: string.h:1490
const char * doc
Definition: pyerrors.h:226
New:
maxon::Result<void> Init(BaseDocument* doc, const maxon::CString& inputColorSpaceLowName, const maxon::CString& inputColorSpaceHighName, const maxon::CString& renderColorSpaceName, CONVERSION_FLAGS flags = CONVERSION_FLAGS::ADD_UNDO);
PyCompilerFlags * flags
Definition: ast.h:14
ADD_UNDO
Definition: lib_scene_color_converter.h:1
Old:
Bool CopyTo(BaseSelect* dest) const;
New:
Bool CopyTo(BaseSelect* dest, Bool alwaysDirty = true) const;
Old:
MAX = 97
MAX
Maximum NBIT.
Definition: ge_prepass.h:119
New:
MAX = 98
Old:
#define API_VERSION 2023000
New:
#define API_VERSION 2023100

cinema_hybrid.framework

Added:
using CreateMaterialWithDataDelegate = Delegate<::BaseMaterial*(::BaseDocument*, const Data& textureUrlOrColor)>;
Definition: c4d_basematerial.h:28
Delegate<::BaseMaterial *(::BaseDocument *, const Data &textureUrlOrColor)> CreateMaterialWithDataDelegate
Definition: createdefaultmaterialdelegate.h:102
Added:
class RendererDefaultMaterialInterface

core.framework

Added:
maxon::Char Char
Definition: ge_sys_math.h:56
#define MAXON_ATTRIBUTE_FORCE_INLINE
Definition: apibase.h:111
Bool LessThan(UInt a1, UInt a2, UInt b1, UInt b2)
Definition: integer.h:151
Added:
#define MAXON_OFFSETOF_NON_STANDARD_LAYOUT(T, M)
Added:
static const DataType& GetType()
Added:
template <typename T, Bool HAS_ERROR> struct AddResultHelper
template <typename T> struct AddResultHelper<T, true>
template <typename T> struct AddResultHelper<ResultOk<T>, true>
template <typename T> struct AddResultHelper<Result<T>, true>
template <> struct AddResultHelper<ResultMemT<Bool>, true>
template <typename T> struct AddResultHelper<ResultMemT<T*>, true>
template <typename T> struct AddResultHelper<ResultRef<T>, true>
template <typename T, Bool HAS_ERROR> using AddResult = typename maxon::details::AddResultHelper<T, HAS_ERROR>::type;
typename maxon::details::AddResultHelper< T, HAS_ERROR >::type AddResult
Definition: interfacebase.h:1984
T type
Definition: interfacebase.h:1949
Added:
Bool ReserveInitialChunk(const Int chunkSize, INDEXTYPE& i, INDEXTYPE& toChunk)
Py_ssize_t i
Definition: abstract.h:645
maxon::Int Int
Definition: ge_sys_math.h:64
Old:
#define MAXON_CORE_FRAMEWORK_VERSION 2022901
New:
#define MAXON_CORE_FRAMEWORK_VERSION 2023100
Old:
blockarryallocator.h
New:
arrayallocator.h (The names of entities inside the file remained the same).
PyObject PyObject * names
Definition: code.h:159
Old:
template <typename LOOP> UInt LocalLoop(DynamicContext<USERCONTEXT, INDEXTYPE>& localContext, const Int chunkSize, const LOOP& obj)
PyObject * obj
Definition: complexobject.h:60
LOOP
Loop.
Definition: ge_prepass.h:6
maxon::UInt UInt
Definition: ge_sys_math.h:65
New:
template <typename LOOP> UInt LocalLoop(DynamicContext<USERCONTEXT, INDEXTYPE>& localContext, Int chunkSize, INDEXTYPE i, INDEXTYPE toChunk, const LOOP& obj)
Old:
class ThreadLocalPointer
New:
template <typename P> class ThreadLocalPointer
Old:
class ThreadLocalDestructiblePointer
New:
template <typename P> class ThreadLocalDestructiblePointer
Old:
class ThreadLocalDestructiblePointer
New:
template <typename P> class ThreadLocalDestructiblePointer
Removed:
#define MAXON_REFERENCE_UNIQUE(FREEIMPL)
#define PRIVATE_MAXON_REFERENCE_UNIQUE_FLAGS
#define PRIVATE_MAXON_REFERENCE_UNIQUE_COPY(Name)
Removed:
static MAXON_ATTRIBUTE_FORCE_INLINE constexpr const SqrMat3& NullValue()
T NullValue()
Definition: nullvalue.h:210
Removed:
static MAXON_ATTRIBUTE_FORCE_INLINE constexpr const Mat3& NullValue()
Removed:
template <typename T> struct IsZeroInitialized<SqrMat3<T>> : public IsZeroInitialized<T> { };
template <typename T> struct IsZeroInitialized<Mat3<T>> : public IsZeroInitialized<T> { };
Removed:
static MAXON_ATTRIBUTE_FORCE_INLINE constexpr const SqrMat2& NullValue()
Removed:
static MAXON_ATTRIBUTE_FORCE_INLINE constexpr const Mat2& NullValue()
Removed:
template <typename T> struct IsZeroInitialized<SqrMat2<T>> : public IsZeroInitialized<T> { };
template <typename T> struct IsZeroInitialized<Mat2<T>> : public IsZeroInitialized<T> { };
Removed:
static MAXON_ATTRIBUTE_FORCE_INLINE constexpr const SqrMat4& NullValue()
Removed:
template <typename T> struct IsZeroInitialized<SqrMat4<T>> : public IsZeroInitialized<T> { };

corenodes.framework

Added:
class CoreNodeErrorHelper
Added:
MAXON_OPERATOR_EQUALITY(PortId, _indexDir, _name);
#define MAXON_OPERATOR_EQUALITY(T,...)
Definition: classhelpers.h:502
Removed:
FrameData* GetParent()

exchange.framework

Added:
This is the subsurface color.
MAXON_ATTRIBUTE(Color, SUBSURFACE_COLOR, "subsurface_color");
This scales the overall subsurface effect (0.0 - 1.0).
MAXON_ATTRIBUTE(Float, SUBSURFACE_WEIGHT, "subsurface_weight");
This can be used to control the average distance that light can travel below the surface before it is reduced by scattering such that it can no longer have a visible effect.
MAXON_ATTRIBUTE(Color, SUBSURFACE_RADIUS, "subsurface_radius");
This value is multiplied by the RGB components of the radius to determine the distance the light can travel below the surface before it is fully scattered.
MAXON_ATTRIBUTE(Float, SUBSURFACE_SCALE, "subsurface_scale");
This value can be used to influence the direction in which the light is scattered below the surface.
MAXON_ATTRIBUTE(Float, SUBSURFACE_ANISOTROPY, "subsurface_anisotropy");
MAXON_ATTRIBUTE(Group, SUBSURFACE, "subsurface");
PyObject * value
Definition: abstract.h:715
#define MAXON_ATTRIBUTE(TYPE, NAME, RID,...)
Definition: fid.h:156
RGB
8-bit RGB channels.
Definition: ge_prepass.h:7
maxon::Float Float
Definition: ge_sys_math.h:66
Col3< Float, 1 > Color
Definition: vector.h:84
void Group
special datatype for groups.
Definition: fid.h:112
PyObject Py_ssize_t Py_ssize_t int direction
Definition: unicodeobject.h:916

image.framework

Added:
MAXON_METHOD Result<Opt<ImageBaseRef>> GetImage(UpdateCacheDelegate&& updateDelegate, Bool async) const;

misc.framework

Added:
MAXON_METHOD Result<void> AddDummyFloatVariable(const String& name, Bool caseSensitive);
MAXON_METHOD Result<void> AddDummyIntVariable(const String& name, Bool caseSensitive);
MAXON_METHOD Result<void> AddDummyStringVariable(const String& name, Bool caseSensitive);
MAXON_METHOD Result<void> AddDummyDataVariable(const String& name, Bool caseSensitive);
MAXON_METHOD Result<void> CalculateFloat(const FormulaParserCacheRef& cache, const VariableDictionary& varOverrides, Float32& result);
MAXON_METHOD Result<void> CalculateFloat(const FormulaParserCacheRef& cache, const VariableDictionary& varOverrides, Float64& result);
MAXON_METHOD Result<void> CalculateInt(const FormulaParserCacheRef& cache, const VariableDictionary& varOverrides, Int64& result);
const char const char * name
Definition: abstract.h:195
Definition: c4d_string.h:39
PyObject PyObject * result
Definition: abstract.h:43
maxon::Int64 Int64
Definition: ge_sys_math.h:62
maxon::Float32 Float32
Definition: ge_sys_math.h:68
maxon::Float64 Float64
Definition: ge_sys_math.h:67
Added:
MAXON_METHOD Result<void> Add2(const GmlNode& node, const Delegate<Tuple<Int32, String>(const GmlNode&)>& idDelegate);
Definition: node.h:10
Added:
inline Result<Url> GetUrlFromIconProviders(const CString& iconId)
Result< Url > GetUrlFromIconProviders(const CString &iconId)
Definition: iconprovider.h:24
Added:
#define CheckUnitTestState(condition, ...)

neutron.framework

Added:
namespace NEARESTNEIGHBOR
{
MAXON_RESOURCE_DATABASE_SCOPE("net.maxon.neutron.geometry.points.nearestneighbor");
MAXON_ATTRIBUTE(Array<Vector>, TARGETPOINTSIN, "targetpointsin");
MAXON_ATTRIBUTE(String, SELECTIONSTRING, "selectionstring");
MAXON_ATTRIBUTE(Vector, QUERYPOSITION, "queryposition");
MAXON_ATTRIBUTE(Float, MAXDISTANCE, "maxdistance");
MAXON_ATTRIBUTE(Int, MAXNEIGHBORCOUNT, "maxneighborcount");
MAXON_ATTRIBUTE(Array<Int>, TARGETIDXNEAREST, "targetidxnearest");
}
#define MAXON_RESOURCE_DATABASE_SCOPE(id)
Definition: fid.h:107
@ SELECTION
Selected edges.
StrongCOWRef< IndexSelectionType > IndexSelection
Definition: nodes_modeling.h:17
Added:
MAXON_ATTRIBUTE(void, GEOMETRYOUT, "geometryout");
Added:
MAXON_ATTRIBUTE(void, MODE_ENUM_POLYGONS, "polygons");
Old:
static constexpr Int32 MSG_GET_INSTRUMENTATION_MANAGER = 180420113;
maxon::Int32 Int32
Definition: ge_sys_math.h:60
New:
static constexpr Int32 MSG_GET_INSTRUMENTATION_HANDLER = 180420113;
static constexpr Int32 MSG_GET_INSTRUMENTATION_HANDLER
Definition: neutron_ids.h:45
Old:
static constexpr Int32 MSG_REGISTER_INSPECTOR = 180420205;
New:
static constexpr Int32 MSG_REGISTER_PORT_VALUE_LISTENER = 180420205;
static constexpr Int32 MSG_REGISTER_PORT_VALUE_LISTENER
Definition: neutron_ids.h:73

nodes.framework

Added:
MAXON_ATTRIBUTE(CString, INPROFILE, "inprofile");
MAXON_ATTRIBUTE(CString, OUTPROFILE, "outprofile");
RESULT
The data type is a Result.
Definition: apibase.h:37
COLOR
Vector.
Definition: c4d_basebitmap.h:5
Col4< Float, 1 > ColorA
Definition: vector4d.h:60
Added:
MAXON_ATTRIBUTE(DataType, DATATYPEIN, "datatypein");
MAXON_ATTRIBUTE(void, VAR1IN, "var1in");
MAXON_ATTRIBUTE(String, CONDITIONIN, "conditionin");message
MAXON_ATTRIBUTE(String, MESSAGEFORMATIN, "messageformatin");
MAXON_ATTRIBUTE(Bool, RESULTOUT, "resultout");
MAXON_ATTRIBUTE(Bool, CONSTANTOUT, "constantout");
MAXON_ATTRIBUTE(String, ERRORMSGOUT, "errormsgout");
const char * message
Definition: pyerrors.h:189
Added:
New file containing the attributes for the formula node.
Added:
MAXON_ATTRIBUTE(Int, INDEX, "index");
COUNT
Length of the arrays changed.
Definition: c4d_baseeffectordata.h:3
Added:
static MAXON_METHOD Result<Id> MakePortUuid(const Char* prefix);
static MAXON_METHOD Result<Id> MakePortUuid(PORT_DIR dir);
PORT_DIR
Definition: graph_basics.h:34
Added:
template <typename T> Result<void> SetNoKindArgument(const InternedId& id, T&& value)

python.framework

Added:
MAXON_METHOD Int32* CPy_UTF8Mode();
MAXON_METHOD Int32* CPy_QuietFlag();
MAXON_METHOD Int32* CPy_UnbufferedStdioFlag();
MAXON_METHOD Int32* CPy_IsolatedFlag();
Added:
UTF8MODE = 1 << 1,
QUIET = 1 << 4,
OPTIMIZE_LEVEL1 = 1 << 7,
OPTIMIZE_LEVEL2 = 1 << 8,
UNBUFFEREDSTDIO = 1 << 15,
HASHRANDOMSEED = 1 << 16, // Can't be used ATM since Cinema 4D only retrieve flags and not integer value
ISOLATED = 1 << 17,
ISOLATED
Definition: cpython_raw.h:17
LEGACYWINDOWSSTDIO
Definition: cpython_raw.h:21
OPTIMIZE_LEVEL1
Definition: cpython_raw.h:7
LEGACYWINDOWSFSENCODING
Definition: cpython_raw.h:20
UNBUFFEREDSTDIO
Definition: cpython_raw.h:15
OPTIMIZE_LEVEL2
Definition: cpython_raw.h:8
HASHRANDOMSEED
Definition: cpython_raw.h:16
UTF8MODE
Definition: cpython_raw.h:1
QUIET
Just return allocation numbers.
Definition: system.h:1

volume.framework

Added:
MAXON_METHOD Result<void> SetVecType(VECTORGRIDTYPE gridType);
MAXON_METHOD VECTORGRIDTYPE GetVecType() const;
VECTORGRIDTYPE
Vector Volume Types.
Definition: ge_prepass.h:1900
Added:
static MAXON_METHOD Result<Array<Vector>> ScatterPointsInFog(const Volume& volume, UInt64 pointCount, Float spread);
maxon::UInt64 UInt64
Definition: ge_sys_math.h:63