Initial Grease Pencil 3.0 stage #106848

Merged
Falk David merged 224 commits from filedescriptor/blender:grease-pencil-v3 into main 2023-05-30 11:14:22 +02:00
2 changed files with 62 additions and 16 deletions
Showing only changes of commit f133504646 - Show all commits

View File

@ -154,7 +154,6 @@ static void curves_blend_read_data(BlendDataReader *reader, ID *id)
/* Geometry */ /* Geometry */
curves->geometry.wrap().blend_read(*reader); curves->geometry.wrap().blend_read(*reader);
BLO_read_data_address(reader, &curves->surface_uv_map); BLO_read_data_address(reader, &curves->surface_uv_map);
curves->geometry.runtime = MEM_new<blender::bke::CurvesGeometryRuntime>(__func__); curves->geometry.runtime = MEM_new<blender::bke::CurvesGeometryRuntime>(__func__);

View File

@ -53,7 +53,7 @@ static void grease_pencil_foreach_id(ID *id, LibraryForeachIDData *data)
for (int i = 0; i < grease_pencil->material_array_size; i++) { for (int i = 0; i < grease_pencil->material_array_size; i++) {
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, grease_pencil->material_array[i], IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, grease_pencil->material_array[i], IDWALK_CB_USER);
} }
// TODO: walk all the referenced drawings /* TODO: walk all the referenced drawings */
} }
static void grease_pencil_blend_write(BlendWriter *writer, ID *id, const void *id_address) static void grease_pencil_blend_write(BlendWriter *writer, ID *id, const void *id_address)
@ -62,36 +62,41 @@ static void grease_pencil_blend_write(BlendWriter *writer, ID *id, const void *i
/* TODO: Flush runtime data to storage. */ /* TODO: Flush runtime data to storage. */
/* Write animation data. */
if (grease_pencil->adt) {
BKE_animdata_blend_write(writer, grease_pencil->adt);
}
/* Write LibData */ /* Write LibData */
BLO_write_id_struct(writer, GreasePencil, id_address, &grease_pencil->id); BLO_write_id_struct(writer, GreasePencil, id_address, &grease_pencil->id);
BKE_id_blend_write(writer, &grease_pencil->id); BKE_id_blend_write(writer, &grease_pencil->id);
/* Drawings. */ /* Write drawings. */
for (int i = 0; i < grease_pencil->drawing_array_size; i++) { for (int i = 0; i < grease_pencil->drawing_array_size; i++) {
GreasePencilDrawingOrReference *drawing_or_ref = grease_pencil->drawing_array[i]; GreasePencilDrawingOrReference *drawing_or_ref = grease_pencil->drawing_array[i];
BLO_write_struct(writer, GreasePencilDrawingOrReference, drawing_or_ref);
switch (drawing_or_ref->type) { switch (drawing_or_ref->type) {
case GREASE_PENCIL_DRAWING: { case GREASE_PENCIL_DRAWING: {
GreasePencilDrawing *drawing = reinterpret_cast<GreasePencilDrawing *>(drawing_or_ref); GreasePencilDrawing *drawing = reinterpret_cast<GreasePencilDrawing *>(drawing_or_ref);
BLO_write_struct(writer, GreasePencilDrawing, drawing);
drawing->geometry.wrap().blend_write(*writer, grease_pencil->id); drawing->geometry.wrap().blend_write(*writer, grease_pencil->id);
break; break;
} }
case GREASE_PENCIL_DRAWING_REFERENCE: { case GREASE_PENCIL_DRAWING_REFERENCE: {
GreasePencilDrawingReference *drawing_reference = GreasePencilDrawingReference *drawing_reference =
reinterpret_cast<GreasePencilDrawingReference *>(drawing_or_ref); reinterpret_cast<GreasePencilDrawingReference *>(drawing_or_ref);
BLO_write_raw(writer, sizeof(void *), drawing_reference->id_reference); BLO_write_struct(writer, GreasePencilDrawingReference, drawing_reference);
break; break;
} }
} }
} }
/* Write layer tree. */
for (int i = 0; i < grease_pencil->layer_tree_storage.nodes_num; i++) { for (int i = 0; i < grease_pencil->layer_tree_storage.nodes_num; i++) {
GreasePencilLayerTreeNode *node = grease_pencil->layer_tree_storage.nodes[i]; GreasePencilLayerTreeNode *node = grease_pencil->layer_tree_storage.nodes[i];
BLO_write_struct(writer, GreasePencilLayerTreeNode, node);
switch (node->type) { switch (node->type) {
case GREASE_PENCIL_LAYER_TREE_LEAF: { case GREASE_PENCIL_LAYER_TREE_LEAF: {
GreasePencilLayerTreeLeaf *node_leaf = reinterpret_cast<GreasePencilLayerTreeLeaf *>(node); GreasePencilLayerTreeLeaf *node_leaf = reinterpret_cast<GreasePencilLayerTreeLeaf *>(node);
BLO_write_struct(writer, GreasePencilLayerTreeLeaf, node_leaf);
/* Write layer data. */ /* Write layer data. */
BLO_write_int32_array( BLO_write_int32_array(
writer, node_leaf->layer.frames_storage.size, node_leaf->layer.frames_storage.keys); writer, node_leaf->layer.frames_storage.size, node_leaf->layer.frames_storage.keys);
@ -101,30 +106,72 @@ static void grease_pencil_blend_write(BlendWriter *writer, ID *id, const void *i
} }
case GREASE_PENCIL_LAYER_TREE_GROUP: { case GREASE_PENCIL_LAYER_TREE_GROUP: {
GreasePencilLayerTreeGroup *group = reinterpret_cast<GreasePencilLayerTreeGroup *>(node); GreasePencilLayerTreeGroup *group = reinterpret_cast<GreasePencilLayerTreeGroup *>(node);
BLO_write_raw(writer, sizeof(int), &group->children_num); BLO_write_struct(writer, GreasePencilLayerTreeGroup, group);
break; break;
} }
} }
} }
/* Materials. */ /* Write materials. */
BLO_write_pointer_array( BLO_write_pointer_array(
writer, grease_pencil->material_array_size, grease_pencil->material_array); writer, grease_pencil->material_array_size, grease_pencil->material_array);
/* Animation data. */
if (grease_pencil->adt) {
BKE_animdata_blend_write(writer, grease_pencil->adt);
}
} }
static void grease_pencil_blend_read_data(BlendDataReader *reader, ID *id) static void grease_pencil_blend_read_data(BlendDataReader *reader, ID *id)
{ {
GreasePencil *grease_pencil = (GreasePencil *)id; GreasePencil *grease_pencil = (GreasePencil *)id;
/* TODO: Convert storage data to runtime structs. */
/* Read animation data. */
BLO_read_data_address(reader, &grease_pencil->adt); BLO_read_data_address(reader, &grease_pencil->adt);
BKE_animdata_blend_read_data(reader, grease_pencil->adt); BKE_animdata_blend_read_data(reader, grease_pencil->adt);
/* Read drawings. */
BLO_read_pointer_array(reader, (void **)&grease_pencil->drawing_array);
for (int i = 0; i < grease_pencil->drawing_array_size; i++) {
GreasePencilDrawingOrReference *drawing_or_ref = grease_pencil->drawing_array[i];
switch (drawing_or_ref->type) {
case GREASE_PENCIL_DRAWING: {
GreasePencilDrawing *drawing = reinterpret_cast<GreasePencilDrawing *>(drawing_or_ref);
BLO_read_data_address(reader, &drawing);
drawing->geometry.wrap().blend_read(*reader);
break;
}
case GREASE_PENCIL_DRAWING_REFERENCE: {
GreasePencilDrawingReference *drawing_reference =
reinterpret_cast<GreasePencilDrawingReference *>(drawing_or_ref);
BLO_read_data_address(reader, &drawing_reference);
break;
}
}
}
/* Read layer tree. */
BLO_read_pointer_array(reader, (void **)&grease_pencil->layer_tree_storage.nodes);
for (int i = 0; i < grease_pencil->layer_tree_storage.nodes_num; i++) {
GreasePencilLayerTreeNode *node = grease_pencil->layer_tree_storage.nodes[i];
switch (node->type) {
case GREASE_PENCIL_LAYER_TREE_LEAF: {
GreasePencilLayerTreeLeaf *node_leaf = reinterpret_cast<GreasePencilLayerTreeLeaf *>(node);
BLO_read_data_address(reader, &node_leaf);
/* Read layer data. */
BLO_read_int32_array(
reader, node_leaf->layer.frames_storage.size, &node_leaf->layer.frames_storage.keys);
BLO_read_int32_array(
reader, node_leaf->layer.frames_storage.size, &node_leaf->layer.frames_storage.values);
break;
}
case GREASE_PENCIL_LAYER_TREE_GROUP: {
GreasePencilLayerTreeGroup *group = reinterpret_cast<GreasePencilLayerTreeGroup *>(node);
BLO_read_data_address(reader, &group);
break;
}
}
}
/* Read materials. */
BLO_read_pointer_array(reader, (void **)&grease_pencil->material_array);
/* TODO: Convert storage data to runtime structs. */
} }
static void grease_pencil_blend_read_lib(BlendLibReader *reader, ID *id) static void grease_pencil_blend_read_lib(BlendLibReader *reader, ID *id)