Open Search
    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