Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-11-06 18:42:37 +0300
committerJacques Lucke <jacques@blender.org>2020-11-06 18:42:50 +0300
commitaf245326125aed919bc7560d20f6152e55d1478f (patch)
treecc0c41d9af71f6f58d7e27d4036c6ee1fcf3dced /source/blender/blenkernel
parent580ff2cb937daf43699908afe1190baea8d117aa (diff)
Refactor: move ShaderFx .blend I/O to blenkernel
Ref T76372.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_object.h5
-rw-r--r--source/blender/blenkernel/BKE_shader_fx.h7
-rw-r--r--source/blender/blenkernel/intern/object.c15
-rw-r--r--source/blender/blenkernel/intern/shader_fx.c44
4 files changed, 71 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index b7015942cb4..60a829ad0aa 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -416,6 +416,11 @@ void BKE_object_to_mesh_clear(struct Object *object);
void BKE_object_check_uuids_unique_and_report(const struct Object *object);
+void BKE_object_modifiers_lib_link_common(void *userData,
+ struct Object *ob,
+ struct ID **idpoin,
+ int cb_flag);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h
index 4b9688f9515..7c2d363be5c 100644
--- a/source/blender/blenkernel/BKE_shader_fx.h
+++ b/source/blender/blenkernel/BKE_shader_fx.h
@@ -33,6 +33,9 @@ struct ListBase;
struct ModifierUpdateDepsgraphContext;
struct Object;
struct ShaderFxData;
+struct BlendWriter;
+struct BlendDataReader;
+struct BlendLibReader;
#define SHADER_FX_ACTIVE(_fx, _is_render) \
((((_fx)->mode & eShaderFxMode_Realtime) && (_is_render == false)) || \
@@ -170,6 +173,10 @@ void BKE_shaderfx_foreach_ID_link(struct Object *ob, ShaderFxIDWalkFunc walk, vo
bool BKE_shaderfx_has_gpencil(struct Object *ob);
+void BKE_shaderfx_blend_write(struct BlendWriter *writer, struct ListBase *fxbase);
+void BKE_shaderfx_blend_read_data(struct BlendDataReader *reader, struct ListBase *lb);
+void BKE_shaderfx_blend_read_lib(struct BlendLibReader *reader, struct Object *ob);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f658594d878..ca259a9fbd1 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -135,6 +135,8 @@
#include "DRW_engine.h"
+#include "BLO_read_write.h"
+
#include "SEQ_sequencer.h"
#ifdef WITH_PYTHON
@@ -4807,3 +4809,16 @@ void BKE_object_check_uuids_unique_and_report(const Object *object)
BKE_pose_check_uuids_unique_and_report(object->pose);
BKE_modifier_check_uuids_unique_and_report(object);
}
+
+void BKE_object_modifiers_lib_link_common(void *userData,
+ struct Object *ob,
+ struct ID **idpoin,
+ int cb_flag)
+{
+ BlendLibReader *reader = userData;
+
+ BLO_read_id_address(reader, ob->id.lib, idpoin);
+ if (*idpoin != NULL && (cb_flag & IDWALK_CB_USER) != 0) {
+ id_us_plus_no_lib(*idpoin);
+ }
+}
diff --git a/source/blender/blenkernel/intern/shader_fx.c b/source/blender/blenkernel/intern/shader_fx.c
index 2ae95492708..3727ec866ca 100644
--- a/source/blender/blenkernel/intern/shader_fx.c
+++ b/source/blender/blenkernel/intern/shader_fx.c
@@ -50,6 +50,8 @@
#include "FX_shader_types.h"
+#include "BLO_read_write.h"
+
static ShaderFxTypeInfo *shader_fx_types[NUM_SHADER_FX_TYPES] = {NULL};
/* *************************************************** */
@@ -276,3 +278,45 @@ ShaderFxData *BKE_shaderfx_findby_name(Object *ob, const char *name)
{
return BLI_findstring(&(ob->shader_fx), name, offsetof(ShaderFxData, name));
}
+
+void BKE_shaderfx_blend_write(BlendWriter *writer, ListBase *fxbase)
+{
+ if (fxbase == NULL) {
+ return;
+ }
+
+ LISTBASE_FOREACH (ShaderFxData *, fx, fxbase) {
+ const ShaderFxTypeInfo *fxi = BKE_shaderfx_get_info(fx->type);
+ if (fxi == NULL) {
+ return;
+ }
+
+ BLO_write_struct_by_name(writer, fxi->struct_name, fx);
+ }
+}
+
+void BKE_shaderfx_blend_read_data(BlendDataReader *reader, ListBase *lb)
+{
+ BLO_read_list(reader, lb);
+
+ LISTBASE_FOREACH (ShaderFxData *, fx, lb) {
+ fx->error = NULL;
+
+ /* if shader disappear, or for upward compatibility */
+ if (NULL == BKE_shaderfx_get_info(fx->type)) {
+ fx->type = eShaderFxType_None;
+ }
+ }
+}
+
+void BKE_shaderfx_blend_read_lib(BlendLibReader *reader, Object *ob)
+{
+ BKE_shaderfx_foreach_ID_link(ob, BKE_object_modifiers_lib_link_common, reader);
+
+ /* If linking from a library, clear 'local' library override flag. */
+ if (ob->id.lib != NULL) {
+ LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) {
+ fx->flag &= ~eShaderFxFlag_OverrideLibrary_Local;
+ }
+ }
+}