diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-02-03 15:00:15 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-02-03 15:33:59 +0300 |
commit | 0ee52a5741a1fd831efff0d454bab3c6b00e0d1b (patch) | |
tree | 06ae2a5b2bbb4d283c15116849b3d668e812dad1 | |
parent | 6cdb3845a351ee9437030bd50ca7a7124953e097 (diff) |
Get rid of runtime data struct.
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/draw/DRW_engine.h | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/clay/clay.c | 171 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 12 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_material_types.h | 17 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 11 |
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); } |