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:
authorClément Foucault <foucault.clem@gmail.com>2017-02-03 15:00:15 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-02-03 15:33:59 +0300
commit0ee52a5741a1fd831efff0d454bab3c6b00e0d1b (patch)
tree06ae2a5b2bbb4d283c15116849b3d668e812dad1
parent6cdb3845a351ee9437030bd50ca7a7124953e097 (diff)
Get rid of runtime data struct.
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/blenkernel/intern/scene.c2
-rw-r--r--source/blender/blenloader/intern/readfile.c2
-rw-r--r--source/blender/draw/DRW_engine.h4
-rw-r--r--source/blender/draw/engines/clay/clay.c171
-rw-r--r--source/blender/draw/intern/DRW_render.h4
-rw-r--r--source/blender/draw/intern/draw_manager.c12
-rw-r--r--source/blender/makesdna/DNA_material_types.h17
-rw-r--r--source/blender/makesdna/DNA_scene_types.h5
-rw-r--r--source/blender/makesrna/intern/rna_scene.c11
10 files changed, 110 insertions, 120 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 89af048f73d..435504859a4 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -113,8 +113,6 @@ void BKE_material_free(Material *ma)
BKE_previewimg_free(&ma->preview);
for (MaterialEngineSettings *mes = ma->engines_settings.first; mes; mes = mes->next) {
- if (mes->runtime)
- MEM_SAFE_FREE(mes->runtime);
if (mes->data)
MEM_SAFE_FREE(mes->data);
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 807496d88e1..cc136e8e748 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -570,8 +570,6 @@ void BKE_scene_free(Scene *sce)
/* Runtime Engine Data */
for (RenderEngineSettings *res = sce->engines_settings.first; res; res = res->next) {
- if (res->runtime)
- MEM_freeN(res->runtime);
if (res->data)
MEM_freeN(res->data);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cb69d54fc49..9206f4b65e4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3994,7 +3994,6 @@ static void direct_link_material(FileData *fd, Material *ma)
link_list(fd, &ma->engines_settings);
for (mes = ma->engines_settings.first; mes; mes = mes->next) {
- mes->runtime = NULL;
mes->data = newdataadr(fd, mes->data);
}
}
@@ -6234,7 +6233,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
link_list(fd, &sce->engines_settings);
for (res = sce->engines_settings.first; res; res = res->next) {
- res->runtime = NULL;
res->data = newdataadr(fd, res->data);
}
}
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 05222574ae9..4f86e3fcd91 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -39,7 +39,7 @@ void DRW_engines_free(void);
void DRW_pass_free(struct DRWPass *pass);
/* Settings */
-void *DRW_material_settings_get(struct Material *ma, const char *engine_name, void ***runtime);
-void *DRW_render_settings_get(struct Scene *scene, const char *engine_name, void ***runtime);
+void *DRW_material_settings_get(struct Material *ma, const char *engine_name);
+void *DRW_render_settings_get(struct Scene *scene, const char *engine_name);
#endif /* __DRW_ENGINE_H__ */ \ No newline at end of file
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 7be13c079fa..3bdd48d319e 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -84,8 +84,10 @@ static struct CLAY_data {
} data = {NULL};
/* CLAY_data.ubo_flag */
-#define CLAY_UBO_CLEAR (1 << 0)
-#define CLAY_UBO_REFRESH (1 << 1)
+enum {
+ CLAY_UBO_CLEAR = (1 << 0),
+ CLAY_UBO_REFRESH = (1 << 1),
+};
/* keep it under MAX_BUFFERS */
typedef struct CLAY_FramebufferList{
@@ -105,9 +107,11 @@ typedef struct CLAY_TextureList{
} CLAY_TextureList;
/* for clarity follow the same layout as CLAY_TextureList */
-#define SCENE_COLOR 0
-#define SCENE_DEPTH 1
-#define SCENE_DEPTH_LOW 2
+enum {
+ SCENE_COLOR,
+ SCENE_DEPTH,
+ SCENE_DEPTH_LOW,
+};
/* keep it under MAX_PASSES */
typedef struct CLAY_PassList{
@@ -268,8 +272,10 @@ MaterialEngineSettings *CLAY_material_settings_create(void)
return (MaterialEngineSettings *)settings;
}
-static void CLAY_engine_init(void)
+static void CLAY_engine_init(const bContext *C)
{
+ Main *bmain = CTX_data_main(C);
+
/* Create Texture Array */
if (!data.matcap_array) {
PreviewImage *prv[24]; /* For now use all of the 24 internal matcaps */
@@ -347,6 +353,28 @@ static void CLAY_engine_init(void)
BLI_dynstr_free(ds);
MEM_freeN(matcap_with_ao);
}
+
+ /* Cleanup all runtime data loaded from file */
+ for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
+ /* Using render settings as material settings */
+ MaterialEngineSettingsClay *res = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY);
+ res->flag = CLAY_OUTDATED;
+ res->ubo_index = -1;
+
+ /* Update Collections Materials */
+ for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
+ for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+ CollectionEngineSettings *ces;
+ ces = BKE_layer_collection_engine_get(lc, RE_engine_id_BLENDER_CLAY);
+ if (ces) { /* May not exists */
+ BKE_collection_engine_property_value_set_int(ces, "flag", CLAY_OUTDATED);
+ BKE_collection_engine_property_value_set_int(ces, "ubo_index", -1);
+ }
+ }
+ }
+ }
+
+ data.ubo_flag |= CLAY_UBO_REFRESH;
}
static void CLAY_ssao_setup(void)
@@ -362,7 +390,7 @@ static void CLAY_ssao_setup(void)
};
int i;
float *size = DRW_viewport_size_get();
- RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY, NULL);
+ RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY);
DRW_get_dfdy_factors(dfdyfacs);
@@ -425,100 +453,84 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *UNUSED(material_
return grp;
}
-static void CLAY_update_material_runtime(MaterialEngineSettingsClay *settings, MaterialRuntimeClay **runtime)
+static void update_ubo_storage(float matcap_rot, float matcap_hue, float matcap_sat, float matcap_val,
+ float ssao_distance, float ssao_factor_cavity, float ssao_factor_edge,
+ float ssao_attenuation, int matcap_icon, unsigned int current_id)
{
- MaterialRuntimeClay *rt;
-
- if (*runtime == NULL) {
- rt = MEM_mallocN(sizeof(MaterialRuntimeClay), "MaterialRuntimeClay");
- rt->flag = CLAY_OUTDATED;
- data.ubo_flag |= CLAY_UBO_CLEAR;
- *runtime = rt;
- }
-
- rt = *runtime;
-
- if (rt->flag & CLAY_OUTDATED) {
-
- /* Update default material */
- rt->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
- rt->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
-
- rt->matcap_hsv[0] = settings->matcap_hue + 0.5f;
- rt->matcap_hsv[1] = settings->matcap_sat * 2.0f;
- rt->matcap_hsv[2] = settings->matcap_val * 2.0f;
-
- rt->ssao_params_var[0] = settings->ssao_distance;
- rt->ssao_params_var[1] = settings->ssao_factor_cavity;
- rt->ssao_params_var[2] = settings->ssao_factor_edge;
- rt->ssao_params_var[3] = settings->ssao_attenuation;
-
- if (settings->matcap_icon < ICON_MATCAP_01 ||
- settings->matcap_icon > ICON_MATCAP_24)
- {
- settings->matcap_icon = ICON_MATCAP_01;
- }
-
- rt->matcap_id = matcap_to_index(settings->matcap_icon);
+ CLAY_UBO_Material *ubo = &data.mat_storage.materials[current_id];
- if ((rt->type != settings->type)) {
- data.ubo_flag |= CLAY_UBO_CLEAR;
- }
+ ubo->matcap_rot[0] = cosf(matcap_rot * 3.14159f * 2.0f);
+ ubo->matcap_rot[1] = sinf(matcap_rot * 3.14159f * 2.0f);
- rt->type = settings->type;
+ ubo->matcap_hsv[0] = matcap_hue + 0.5f;
+ ubo->matcap_hsv[1] = matcap_sat * 2.0f;
+ ubo->matcap_hsv[2] = matcap_val * 2.0f;
- data.ubo_flag |= CLAY_UBO_REFRESH;
- rt->flag &= ~CLAY_OUTDATED;
- }
-}
+ ubo->ssao_params_var[0] = ssao_distance;
+ ubo->ssao_params_var[1] = ssao_factor_cavity;
+ ubo->ssao_params_var[2] = ssao_factor_edge;
+ ubo->ssao_params_var[3] = ssao_attenuation;
-static void update_ubo_storage(MaterialRuntimeClay *runtime, unsigned int current_id)
-{
- CLAY_UBO_Material *ubo = &data.mat_storage.materials[current_id];
- ubo->matcap_id = runtime->matcap_id;
- copy_v3_v3(ubo->matcap_hsv, runtime->matcap_hsv);
- copy_v2_v2(ubo->matcap_rot, runtime->matcap_rot);
- copy_v4_v4(ubo->ssao_params_var, runtime->ssao_params_var);
-
- runtime->material_id = current_id;
+ ubo->matcap_id = matcap_to_index(matcap_icon);
}
static void CLAY_update_material_ubo(const struct bContext *C)
{
Main *bmain = CTX_data_main(C);
- MaterialRuntimeClay **runtime;
/* Update Default materials */
for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
/* Using render settings as material settings */
- MaterialEngineSettingsClay *res = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY, (void ***)&runtime);
- CLAY_update_material_runtime(res, runtime);
- }
+ MaterialEngineSettingsClay *res = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY);
+
+ if (res->flag & CLAY_OUTDATED)
+ data.ubo_flag |= CLAY_UBO_REFRESH;
- /* Update Scene Materials */
- for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) {
- MaterialEngineSettingsClay *mesc = DRW_material_settings_get(mat, RE_engine_id_BLENDER_CLAY, (void ***)&runtime);
- CLAY_update_material_runtime(mesc, runtime);
+ if (res->matcap_icon < ICON_MATCAP_01 ||
+ res->matcap_icon > ICON_MATCAP_24)
+ {
+ res->matcap_icon = ICON_MATCAP_01;
+ }
+
+ res->flag &= ~CLAY_OUTDATED;
+
+
+ /* Update Collections Materials */
+ for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
+ for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+ CollectionEngineSettings *ces;
+ ces = BKE_layer_collection_engine_get(lc, RE_engine_id_BLENDER_CLAY);
+
+ BKE_collection_engine_property_value_set_int(ces, "flag", 0);
+ BKE_collection_engine_property_value_set_int(ces, "ubo_index", 0);
+ }
+ }
}
if (data.ubo_flag & CLAY_UBO_REFRESH) {
int current_id = 0;
+
/* Default materials */
for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
- DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY, (void ***)&runtime);
- update_ubo_storage(*runtime, current_id);
+ MaterialEngineSettingsClay *res = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY);
+
+ update_ubo_storage(res->matcap_rot, res->matcap_hue, res->matcap_sat, res->matcap_val,
+ res->ssao_distance, res->ssao_factor_cavity, res->ssao_factor_edge,
+ res->ssao_attenuation, res->matcap_icon, current_id);
current_id++;
- }
- /* TODO only add materials linked to geometry */
- for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) {
- DRW_material_settings_get(mat, RE_engine_id_BLENDER_CLAY, (void ***)&runtime);
- update_ubo_storage(*runtime, current_id);
+ for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) {
+ for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+ /* TODO */
+ current_id++;
+ }
+ }
current_id++;
}
+
DRW_uniformbuffer_update(data.mat_ubo, &data.mat_storage);
}
@@ -539,12 +551,11 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
/* Clay Pass */
{
- MaterialRuntimeClay **runtime;
- DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY, (void ***)&runtime);
+ MaterialEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY);
passes->clay_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
- default_shgrp = CLAY_shgroup_create(passes->clay_pass, &(*runtime)->material_id);
+ default_shgrp = CLAY_shgroup_create(passes->clay_pass, &settings->ubo_index);
DRW_shgroup_uniform_block(default_shgrp, "material_block", data.mat_ubo, 0);
}
@@ -603,7 +614,7 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
DEG_OBJECT_ITER_END
}
-static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context)
+static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context)
{
/* This function may run for multiple viewports
* so get the current viewport buffers */
@@ -613,7 +624,7 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
DRW_viewport_init(context, (void **)&buffers, (void **)&textures, (void **)&passes);
- CLAY_engine_init();
+ CLAY_engine_init(context);
CLAY_update_material_ubo(context);
@@ -672,6 +683,10 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), Collec
BKE_collection_engine_property_add_float(ces, "ssao_attenuation", 1.0f);
BKE_collection_engine_property_add_float(ces, "ssao_factor_cavity", 1.0f);
BKE_collection_engine_property_add_float(ces, "ssao_factor_edge", 1.0f);
+
+ /* Runtime data (not display in settings) */
+ BKE_collection_engine_property_add_int(ces, "ubo_index", -1);
+ BKE_collection_engine_property_add_int(ces, "flag", CLAY_OUTDATED);
}
void clay_engine_free(void)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 99456286536..90412e65a51 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -204,8 +204,8 @@ bool DRW_viewport_cache_is_dirty(void);
/* Settings */
#ifndef __DRW_ENGINE_H__
-void *DRW_material_settings_get(Material *ma, const char *engine_name, void ***runtime);
-void *DRW_render_settings_get(Scene *scene, const char *engine_name, void ***runtime);
+void *DRW_material_settings_get(Material *ma, const char *engine_name);
+void *DRW_render_settings_get(Scene *scene, const char *engine_name);
#endif /* __DRW_ENGINE_H__ */
/* Draw commands */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index b2766fb7163..ed626d10802 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -931,7 +931,7 @@ void DRW_state_reset(void)
/* ****************************************** Settings ******************************************/
-void *DRW_material_settings_get(Material *ma, const char *engine_name, void ***runtime)
+void *DRW_material_settings_get(Material *ma, const char *engine_name)
{
MaterialEngineSettings *ms = NULL;
@@ -955,15 +955,11 @@ void *DRW_material_settings_get(Material *ma, const char *engine_name, void ***r
BLI_addtail(&ma->engines_settings, ms);
}
- if (runtime) {
- *runtime = &ms->runtime;
- }
-
return ms->data;
}
/* If scene is NULL, use context scene */
-void *DRW_render_settings_get(Scene *scene, const char *engine_name, void ***runtime)
+void *DRW_render_settings_get(Scene *scene, const char *engine_name)
{
RenderEngineSettings *rs = NULL;
@@ -990,10 +986,6 @@ void *DRW_render_settings_get(Scene *scene, const char *engine_name, void ***run
BLI_addtail(&scene->engines_settings, rs);
}
- if (runtime) {
- *runtime = &rs->runtime;
- }
-
return rs->data;
}
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 824925634d4..bd8278f897a 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -94,23 +94,11 @@ typedef struct TexPaintSlot {
typedef struct MaterialEngineSettings {
struct MaterialEngineSettings *next, *prev;
char name[32]; /* engine name - MAX_NAME */
- void *runtime; /* To be free on file read */
void *data;
} MaterialEngineSettings;
/* Clay engine */
-/* Runtime Data Not saved in file */
-typedef struct MaterialRuntimeClay {
- short type;
- short flag;
- int material_id; /* Index in materials UBO */
- int matcap_id; /* Icon ID */
- float matcap_rot[2];
- float matcap_hsv[3];
- float ssao_params_var[4];
-} MaterialRuntimeClay;
-
/* MaterialRuntimeClay.flag */
#define CLAY_OUTDATED 1
@@ -128,7 +116,10 @@ typedef struct MaterialEngineSettingsClay {
float ssao_factor_cavity;
float ssao_factor_edge;
- float pad;
+ /* Runtime */
+ short flag;
+ short pad;
+ int ubo_index;
} MaterialEngineSettingsClay;
/* MaterialEngineSettingsClay.type */
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 1ae914eeea2..9345129a504 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -551,7 +551,6 @@ typedef enum BakePassFilter {
typedef struct RenderEngineSettings {
struct RenderEngineSettings *next, *prev;
char name[32]; /* engine name */
- void *runtime; /* Here to be free on file read */
void *data;
} RenderEngineSettings;
@@ -572,7 +571,9 @@ typedef struct RenderEngineSettingsClay {
float ssao_factor_cavity;
float ssao_factor_edge;
- float pad;
+ short flag;
+ short pad;
+ int ubo_index;
/* end of MaterialEngineSettingsClay */
/* Global Settings */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 17f8bdefb87..11290f3c1d0 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1893,7 +1893,7 @@ static PointerRNA rna_RenderEngineSettings_active_get(PointerRNA *ptr)
RenderEngineSettings *res;
/* Ensure settings exists */
- DRW_render_settings_get(scene, scene->r.engine, NULL);
+ DRW_render_settings_get(scene, scene->r.engine);
res = BLI_findstring(&scene->engines_settings, scene->r.engine, offsetof(RenderEngineSettings, name));
@@ -1903,14 +1903,11 @@ static PointerRNA rna_RenderEngineSettings_active_get(PointerRNA *ptr)
static void rna_RenderEngineSettings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
Scene *sce = (Scene *)ptr->id.data;
- void **runtime;
+ MaterialEngineSettingsClay *res;
- DRW_render_settings_get(sce, sce->r.engine, (void ***)&runtime);
+ res = (MaterialEngineSettingsClay *)DRW_render_settings_get(sce, sce->r.engine);
- if (*runtime) {
- MEM_freeN(*runtime);
- *runtime = NULL;
- }
+ res->flag = CLAY_OUTDATED;
WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL);
}