Currently there are two ways to store data of variable type. The first one is GeData, the class that is used in most of the SDK for example in BaseContainer. The second one is the void*
data that is used in Graph View. This document describes how the Graph View data type system works.
Note: Types registered with CustomDataTypeClass are automatically included in the Graph View type system as well.
Value vs. Data
The actual format of the data stored in the void*
pointer is determined by its value, described by a GvValueID. This is all you need to know to be able to perform calculations with the data or convert it to other types.
Similar kinds of data can share a common value. The combination of a symbol/name and a value is called a data, described by a GvDataID. For example both the normal and the color data types could be implemented as a vector value.
The different data types are grouped in value groups. However, currently there is only one group, so you can ignore this feature most of the time.
- Note
- FindCustomDataTypePlugin() will always return a valid plugin when fed a GvValueID. You cannot convert a GvValueID to a GvDataID directly, though you can do CallCustomDataType(pl, GetDataID).
Raw Format
For the common built-in types (Int32, Float, Vector, Matrix, BaseTime and String) the void*
pointer simply points to the data type in question. For custom data types it instead points to the GvHelper structure. Please observe that generally these pointers are to an array that you should index with the current CPU ID.
- Note
- Normally you should not need to manipulate these raw values.
Dynamic Data
GvDynamicData is a convenience structure that stores both the void*
data pointer and a GvDataInfo structure with the handlers. There are several ways to get a dynamic data structure:
Many of these functions are implemented in clear code in c4d_graphview.h and c4d_graphview.cpp, so you can see how they work.
Examples
Getting a GeData from a calculated port:
{
if (success)
*success = false;
{
if (pl && CallCustomDataType(pl, ConvertGvToGeData)(data.
data, 0,
result))
{
if (success)
*success = true;
}
}
}
CUSTOMDATATYPEPLUGIN * FindCustomDataTypePlugin(Int32 type)
Definition: c4d_gedata.h:83
Definition: c4d_graphview.h:429
Definition: c4d_graphview.h:953
Int32 GetMainID() const
Definition: c4d_graphview.h:1021
GvPortIO GetIO()
Definition: c4d_graphview.h:1009
Bool GetData(void *d, GvValueID type, GvRun *r)
Definition: c4d_graphview.h:1192
Contains helper functions for controlling node evaluation. Cannot be instantiated.
Definition: c4d_graphview.h:314
GvDataInfo * GetDataTypeInfo(GvDataID id)
Definition: c4d_graphview.h:2388
PyObject PyObject * result
Definition: abstract.h:43
maxon::Bool Bool
Definition: ge_sys_math.h:51
Bool GvAllocDynamicData(GvNode *bn, GvDynamicData &data, GvCalc *c, Int32 id)
Definition: c4d_graphview.h:2707
void GvFreeDynamicData(GvDynamicData &data)
Definition: c4d_graphview.h:2718
_Py_clock_info_t * info
Definition: pytime.h:197
GvDataID data_id
The data ID.
Definition: c4d_graphview_def.h:1032
GvValueID value_id
Value ID.
Definition: c4d_graphview_def.h:876
Definition: c4d_graphview_def.h:1092
GV_VALUE_HANDLER * value_handler
Definition: c4d_graphview_def.h:1094
GV_DATA_HANDLER * data_handler
Definition: c4d_graphview_def.h:1093
Represents a GV data and information about its data type.
Definition: c4d_graphview_def.h:1261
void * data
Data pointer.
Definition: c4d_graphview_def.h:1267
GvDataInfo * info
Data type information.
Definition: c4d_graphview_def.h:1268
Port description data.
Definition: c4d_graphview_def.h:1163
GvDataID data_id
Data type ID: GvDataID.
Definition: c4d_graphview_def.h:1171
Setting the port data from a GeData:
{
if (!
node || !port || !run)
return false;
return false;
return false;
if (pl==nullptr)
return false;
if (!CallCustomDataType(pl, ConvertGeDataToGv)(ge_data, data.
data, 0))
return false;
return false
return true;
}
Bool SetData(const void *d, GvValueID type, GvRun *r)
Definition: c4d_graphview.h:1289
Getting a Thinking Particles particle ID from a port:
{
{
if (!helper || !helper->pid)
return NOTOK;
return *(helper->pid);
}
Setting a Thinking Particles particle ID in a port:
{
{
} helper;
helper.pid = &pid;
return GvSetPortGeData(
p,
node, port, run);
}
#define ID_TP_DATA_TYPE_PARTICLE
Particle data type ID.
Definition: c4d_particles.h:31
unsigned char * p
Definition: floatobject.h:87
#define NOTOK
Definition: ge_sys_math.h:263
maxon::Int32 Int32
Definition: ge_sys_math.h:56
Base class for custom data types.
Definition: c4d_customdatatype.h:53