diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-01-29 02:55:46 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-01-29 02:55:46 +0300 |
commit | 744f26b6129fc3723f9934d358060a3cb931474c (patch) | |
tree | 9e3f58255dcd9dbdbfd056f6436ddc9108530cb2 /source/blender | |
parent | 5bf60530e5f1843b613439ea05790412d7f74d41 (diff) |
Change in DNA/RNA. Still missing freeing and read/write.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 5 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 11 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 32 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 7 | ||||
-rw-r--r-- | source/blender/draw/DRW_engine.h | 6 | ||||
-rw-r--r-- | source/blender/draw/engines/clay/clay.c | 123 | ||||
-rw-r--r-- | source/blender/draw/engines/clay/clay.h | 3 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 33 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 46 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_material_types.h | 29 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 88 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_material.c | 22 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 109 |
18 files changed, 319 insertions, 230 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index ad53d03f43a..3fb7ee89aea 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -112,10 +112,7 @@ void BKE_material_free(Material *ma) BKE_icon_id_delete((ID *)ma); BKE_previewimg_free(&ma->preview); - if (ma->clay.runtime) { - MEM_freeN(ma->clay.runtime); - ma->clay.runtime = NULL; - } + /* TODO Free Engine Settings */ } void BKE_material_init(Material *ma) @@ -211,17 +208,6 @@ void BKE_material_init(Material *ma) ma->mode2 = MA_CASTSHADOW; ma->shade_flag = MA_APPROX_OCCLUSION; ma->preview = NULL; - - /* New engines */ - ma->clay.matcap_rot = 0.0f; - ma->clay.matcap_hue = 0.5f; - ma->clay.matcap_sat = 0.5f; - ma->clay.matcap_val = 0.5f; - ma->clay.ssao_distance = 0.2; - ma->clay.ssao_attenuation = 1.0f; - ma->clay.ssao_factor_cavity = 1.0f; - ma->clay.ssao_factor_edge = 1.0f; - ma->clay.runtime = NULL; } Material *BKE_material_add(Main *bmain, const char *name) @@ -263,7 +249,8 @@ Material *BKE_material_copy(Main *bmain, Material *ma) BKE_previewimg_id_copy(&man->id, &ma->id); BLI_listbase_clear(&man->gpumaterial); - man->clay.runtime = NULL; + + /* TODO Duplicate Engine Settings and set runtime to NULL */ BKE_id_copy_ensure_local(bmain, &ma->id, &man->id); @@ -296,7 +283,8 @@ Material *localize_material(Material *ma) man->nodetree = ntreeLocalize(ma->nodetree); BLI_listbase_clear(&man->gpumaterial); - man->clay.runtime = NULL; + + /* TODO Duplicate Engine Settings and set runtime to NULL */ return man; } @@ -1716,7 +1704,7 @@ void copy_matcopybuf(Material *ma) matcopybuf.nodetree = ntreeCopyTree_ex(ma->nodetree, G.main, false); matcopybuf.preview = NULL; BLI_listbase_clear(&matcopybuf.gpumaterial); - matcopybuf.clay.runtime = NULL; + /* TODO Duplicate Engine Settings and set runtime to NULL */ matcopied = 1; } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 2d92e03f766..b4aa47bf9dc 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -569,10 +569,7 @@ void BKE_scene_free(Scene *sce) sce->collection = NULL; /* Runtime Engine Data */ - if (sce->claydata.defsettings.runtime) { - MEM_freeN(sce->claydata.defsettings.runtime); - sce->claydata.defsettings.runtime = NULL; - } + BLI_freelistN(&sce->engines_settings); } void BKE_scene_init(Scene *sce) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index be5f16bef4a..a8dc9d0ed83 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3988,8 +3988,6 @@ static void direct_link_material(FileData *fd, Material *ma) ma->preview = direct_link_preview_image(fd, ma->preview); BLI_listbase_clear(&ma->gpumaterial); - - ma->clay.runtime = NULL; } /* ************ READ PARTICLE SETTINGS ***************** */ @@ -5949,6 +5947,7 @@ static void direct_link_scene(FileData *fd, Scene *sce) RigidBodyWorld *rbw; SceneLayer *sl; SceneRenderLayer *srl; + RenderEngineSettings *res; sce->theDag = NULL; sce->depsgraph = NULL; @@ -6211,8 +6210,12 @@ static void direct_link_scene(FileData *fd, Scene *sce) sl->basact = newdataadr(fd, sl->basact); direct_link_layer_collections(fd, &sl->layer_collections); } - - sce->claydata.defsettings.runtime = NULL; +#if 0 + link_list(fd, &sce->engines_settings); + for (res = sce->engines_settings.first; res; res = res->next) { + res->runtime = NULL; + } +#endif } /* ************ READ WM ***************** */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 954d5aeb105..92592e9fc62 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -178,37 +178,5 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) BLI_strncpy(scene->collection->name, "Master Collection", sizeof(scene->collection->name)); } } - - /* Clay engine defaults */ - if (!DNA_struct_elem_find(fd->filesdna, "Scene", "EngineDataClay", "claydata")) { - for (Scene *scene = main->scene.first; scene; scene = scene->id.next) { - EngineDataClay *settings = &scene->claydata; - - settings->defsettings.matcap_rot = 0.0f; - settings->defsettings.matcap_hue = 0.5f; - settings->defsettings.matcap_sat = 0.5f; - settings->defsettings.matcap_val = 0.5f; - settings->defsettings.ssao_distance = 0.2; - settings->defsettings.ssao_attenuation = 1.0f; - settings->defsettings.ssao_factor_cavity = 1.0f; - settings->defsettings.ssao_factor_edge = 1.0f; - settings->ssao_samples = 32; - } - } - - if (!DNA_struct_elem_find(fd->filesdna, "Material", "MaterialSettingsClay", "clay")) { - for (Material *mat = main->mat.first; mat; mat = mat->id.next) { - MaterialSettingsClay *clay = &mat->clay; - - clay->matcap_rot = 0.0f; - clay->matcap_hue = 0.5f; - clay->matcap_sat = 0.5f; - clay->matcap_val = 0.5f; - clay->ssao_distance = 0.2; - clay->ssao_attenuation = 1.0f; - clay->ssao_factor_cavity = 1.0f; - clay->ssao_factor_edge = 1.0f; - } - } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 1621bb78432..4032dbe9d28 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2666,6 +2666,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase) FreestyleModuleConfig *fmc; FreestyleLineSet *fls; SceneLayer *sl; + RenderEngineSettings *res; sce = scebase->first; while (sce) { @@ -2878,7 +2879,11 @@ static void write_scenes(WriteData *wd, ListBase *scebase) writelist(wd, DATA, ObjectBase, &sl->object_bases); write_layer_collections(wd, &sl->layer_collections); } - +#if 0 + for (res = sce->engines_settings.first; res; res = res->next) { + /* How to write if struct type is not known? */ + } +#endif sce = sce->id.next; } diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index d58e2406faa..4f86e3fcd91 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -29,6 +29,8 @@ //#define WITH_VIEWPORT_CACHE_TEST struct DRWPass; +struct Material; +struct Scene; void DRW_engines_init(void); void DRW_engines_free(void); @@ -36,4 +38,8 @@ void DRW_engines_free(void); /* This is here because GPUViewport needs it */ void DRW_pass_free(struct DRWPass *pass); +/* Settings */ +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 cf5720b911e..6e155776bb7 100644 --- a/source/blender/draw/engines/clay/clay.c +++ b/source/blender/draw/engines/clay/clay.c @@ -235,6 +235,43 @@ static struct GPUTexture *create_jitter_texture(void) return DRW_texture_create_2D(64, 64, DRW_TEX_RG_16, DRW_TEX_FILTER | DRW_TEX_WRAP, &jitter[0][0]); } +static void clay_material_settings_init(MaterialEngineSettingsClay *ma) +{ + ma->matcap_icon = 0; + ma->matcap_rot = 0.0f; + ma->matcap_hue = 0.5f; + ma->matcap_sat = 0.5f; + ma->matcap_val = 0.5f; + ma->ssao_distance = 0.2; + ma->ssao_attenuation = 1.0f; + ma->ssao_factor_cavity = 1.0f; + ma->ssao_factor_edge = 1.0f; +} + +RenderEngineSettings *CLAY_render_settings_create(void) +{ + RenderEngineSettingsClay *settings = MEM_callocN(sizeof(RenderEngineSettingsClay), "RenderEngineSettingsClay"); + + BLI_strncpy(settings->res.name, RE_engine_id_BLENDER_CLAY, 64); + + clay_material_settings_init((MaterialEngineSettingsClay *)settings); + + settings->ssao_samples = 32; + + return (RenderEngineSettings *)settings; +} + +MaterialEngineSettings *CLAY_material_settings_create(void) +{ + MaterialEngineSettingsClay *settings = MEM_callocN(sizeof(MaterialEngineSettingsClay), "MaterialEngineSettingsClay"); + + BLI_strncpy(settings->mes.name, RE_engine_id_BLENDER_CLAY, 64); + + clay_material_settings_init(settings); + + return (MaterialEngineSettings *)settings; +} + static void CLAY_engine_init(void) { /* Create Texture Array */ @@ -329,7 +366,7 @@ static void CLAY_ssao_setup(void) }; int i; float *size = DRW_viewport_size_get(); - EngineDataClay *settings = DRW_render_settings(); + RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY); DRW_get_dfdy_factors(dfdyfacs); @@ -367,11 +404,11 @@ static void CLAY_ssao_setup(void) } } -static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id) +static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *UNUSED(material_id)) { const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3; - CLAY_UBO_Material *mat = &data.mat_storage.materials[0]; + //CLAY_UBO_Material *mat = &data.mat_storage.materials[0]; DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass); DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1); @@ -392,32 +429,33 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id) return grp; } -static void CLAY_update_material_runtime(MaterialSettingsClay *settings) +static void CLAY_update_material_runtime(MaterialEngineSettingsClay *settings) { - MaterialDataClayRuntime *runtime_data; + MaterialRuntimeClay *runtime; - if (!settings->runtime) { - settings->runtime = MEM_mallocN(sizeof(MaterialDataClayRuntime), "MaterialDataClayRuntime"); - settings->runtime->flag = CLAY_OUTDATED; + if (!settings->mes.runtime) { + runtime = MEM_mallocN(sizeof(MaterialRuntimeClay), "MaterialRuntimeClay"); + runtime->flag = CLAY_OUTDATED; + settings->mes.runtime = runtime; data.ubo_flag |= CLAY_UBO_CLEAR; } - runtime_data = settings->runtime; + runtime = settings->mes.runtime; - if (runtime_data->flag & CLAY_OUTDATED) { + if (runtime->flag & CLAY_OUTDATED) { /* Update default material */ - runtime_data->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f); - runtime_data->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f); + runtime->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f); + runtime->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f); - runtime_data->matcap_hsv[0] = settings->matcap_hue + 0.5f; - runtime_data->matcap_hsv[1] = settings->matcap_sat * 2.0f; - runtime_data->matcap_hsv[2] = settings->matcap_val * 2.0f; + runtime->matcap_hsv[0] = settings->matcap_hue + 0.5f; + runtime->matcap_hsv[1] = settings->matcap_sat * 2.0f; + runtime->matcap_hsv[2] = settings->matcap_val * 2.0f; - runtime_data->ssao_params_var[0] = settings->ssao_distance; - runtime_data->ssao_params_var[1] = settings->ssao_factor_cavity; - runtime_data->ssao_params_var[2] = settings->ssao_factor_edge; - runtime_data->ssao_params_var[3] = settings->ssao_attenuation; + runtime->ssao_params_var[0] = settings->ssao_distance; + runtime->ssao_params_var[1] = settings->ssao_factor_cavity; + runtime->ssao_params_var[2] = settings->ssao_factor_edge; + runtime->ssao_params_var[3] = settings->ssao_attenuation; if (settings->matcap_icon < ICON_MATCAP_01 || settings->matcap_icon > ICON_MATCAP_24) @@ -425,29 +463,29 @@ static void CLAY_update_material_runtime(MaterialSettingsClay *settings) settings->matcap_icon = ICON_MATCAP_01; } - runtime_data->matcap_id = matcap_to_index(settings->matcap_icon); + runtime->matcap_id = matcap_to_index(settings->matcap_icon); - if ((runtime_data->type != settings->type)) { + if ((runtime->type != settings->type)) { data.ubo_flag |= CLAY_UBO_CLEAR; } - runtime_data->type = settings->type; + runtime->type = settings->type; data.ubo_flag |= CLAY_UBO_REFRESH; - runtime_data->flag &= ~CLAY_OUTDATED; + runtime->flag &= ~CLAY_OUTDATED; } } -static void update_ubo_storage(MaterialDataClayRuntime *runtime_data, unsigned int current_id) +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_data->matcap_id; - copy_v3_v3(ubo->matcap_hsv, runtime_data->matcap_hsv); - copy_v2_v2(ubo->matcap_rot, runtime_data->matcap_rot); - copy_v4_v4(ubo->ssao_params_var, runtime_data->ssao_params_var); + 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_data->material_id = current_id; + runtime->material_id = current_id; } static void CLAY_update_material_ubo(const struct bContext *C) @@ -456,31 +494,34 @@ static void CLAY_update_material_ubo(const struct bContext *C) /* Update Default materials */ for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { - EngineDataClay *ed = &sce->claydata; - CLAY_update_material_runtime((MaterialSettingsClay *)&ed->defsettings); + /* Using render settings as material settings */ + MaterialEngineSettingsClay *res = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY); + CLAY_update_material_runtime(res); } /* Update Scene Materials */ for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) { - CLAY_update_material_runtime(&mat->clay); + MaterialEngineSettingsClay *mesc = DRW_material_settings_get(mat, RE_engine_id_BLENDER_CLAY); + CLAY_update_material_runtime(mesc); } if (data.ubo_flag & CLAY_UBO_REFRESH) { - MaterialDataClayRuntime *runtime_data; + MaterialRuntimeClay *runtime; int current_id = 0; /* Default materials */ for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { - EngineDataClay *ed = &sce->claydata; - runtime_data = ed->defsettings.runtime; - update_ubo_storage(runtime_data, current_id); + RenderEngineSettingsClay *ed = DRW_render_settings_get(sce, RE_engine_id_BLENDER_CLAY); + runtime = ed->res.runtime; + update_ubo_storage(runtime, current_id); current_id++; } /* TODO only add materials linked to geometry */ for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) { - runtime_data = mat->clay.runtime; - update_ubo_storage(runtime_data, current_id); + MaterialEngineSettingsClay *mesc = DRW_material_settings_get(mat, RE_engine_id_BLENDER_CLAY); + runtime = mesc->mes.runtime; + update_ubo_storage(runtime, current_id); current_id++; } @@ -505,12 +546,12 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C) /* Clay Pass */ { - MaterialDataClayRuntime *runtime; - EngineDataClay *settings = DRW_render_settings(); + MaterialRuntimeClay *runtime; + RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY); passes->clay_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_COLOR); - runtime = settings->defsettings.runtime; + runtime = settings->res.runtime; default_shgrp = CLAY_shgroup_create(passes->clay_pass, &runtime->material_id); DRW_shgroup_uniform_block(default_shgrp, "material_block", data.mat_ubo, 0); diff --git a/source/blender/draw/engines/clay/clay.h b/source/blender/draw/engines/clay/clay.h index 16b53d727c3..404924be2a1 100644 --- a/source/blender/draw/engines/clay/clay.h +++ b/source/blender/draw/engines/clay/clay.h @@ -28,6 +28,9 @@ extern RenderEngineType viewport_clay_type; +struct RenderEngineSettings *CLAY_render_settings_create(void); +struct MaterialEngineSettings *CLAY_material_settings_create(void); + void clay_engine_free(void); #endif /* __ENGINE_CLAY_H__ */
\ No newline at end of file diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 75f5a124a1c..16b3000a46f 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -199,8 +199,10 @@ bool DRW_viewport_is_persp_get(void); bool DRW_viewport_cache_is_dirty(void); /* Settings */ -void *DRW_material_settings(Material *ma); -void *DRW_render_settings(void); +#ifndef __DRW_ENGINE_H__ +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 */ void DRW_draw_background(void); diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 75e712d2b37..a5a465a145e 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -29,6 +29,7 @@ #include "DNA_object_types.h" #include "BLI_utildefines.h" +#include "BLI_math.h" #include "BKE_mesh_render.h" @@ -40,7 +41,7 @@ static struct DRWShapeCache{ Batch *drw_single_vertice; Batch *drw_fullscreen_quad; Batch *drw_plain_axes; - // Batch drw_single_arrow; + Batch *drw_circle_ball; // Batch drw_cube; // Batch drw_circle; // Batch drw_sphere; @@ -80,6 +81,36 @@ Batch *DRW_cache_fullscreen_quad_get(void) return SHC.drw_fullscreen_quad; } +/* Common */ +#define CIRCLE_RESOL 32 + +Batch *DRW_cache_circle_ball_get(void) +{ + if (!SHC.drw_circle_ball) { + float v[3] = {0.0f, 0.0f, 0.0f}; + + /* Position Only 3D format */ + static VertexFormat format = { 0 }; + static unsigned pos_id; + if (format.attrib_ct == 0) { + pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + } + + VertexBuffer *vbo = VertexBuffer_create_with_format(&format); + VertexBuffer_allocate_data(vbo, CIRCLE_RESOL); + + for (int a = 0; a < CIRCLE_RESOL; a++) { + v[0] = sinf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL)); + v[1] = cosf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL)); + v[2] = 0.0f; + setAttrib(vbo, pos_id, 0, v); + } + + SHC.drw_circle_ball = Batch_create(GL_LINE_LOOP, vbo, NULL); + } + return SHC.drw_circle_ball; +} + /* Empties */ Batch *DRW_cache_plain_axes_get(void) { diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index df8f6ec23ef..13b33931b76 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -31,9 +31,9 @@ struct Object; /* Common Shapes */ struct Batch *DRW_cache_fullscreen_quad_get(void); +struct Batch *DRW_cache_circle_ball_get(void); struct Batch *DRW_cache_single_vert_get(void); struct Batch *DRW_cache_plain_axes_get(void); - /* Meshes */ struct Batch *DRW_cache_wire_outline_get(struct Object *ob); struct Batch *DRW_cache_surface_get(struct Object *ob); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 0bb651897b4..26ae4ee6eef 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -847,28 +847,48 @@ void DRW_state_reset(void) set_state(state); } -/* ****************************************** Materials ******************************************/ +/* ****************************************** Settings ******************************************/ -void *DRW_material_settings(Material *ma) +void *DRW_material_settings_get(Material *ma, const char *engine_name) { - Scene *scene = CTX_data_scene(DST.context); + MaterialEngineSettings *ms = NULL; - if (STREQ(scene->r.engine, RE_engine_id_BLENDER_CLAY)) - return &ma->clay; + ms = BLI_findstring(&ma->engines_settings, engine_name, offsetof(MaterialEngineSettings, name)); - BLI_assert(false); - return NULL; + /* If the settings does not exists yet, create it */ + if (ms == NULL) { + /* TODO make render_settings_create a polymorphic function */ + if (STREQ(engine_name, RE_engine_id_BLENDER_CLAY)) { + ms = CLAY_material_settings_create(); + } + + BLI_addtail(&ma->engines_settings, ms); + } + + return ms; } -void *DRW_render_settings(void) +/* If scene is NULL, use context scene */ +void *DRW_render_settings_get(Scene *scene, const char *engine_name) { - Scene *scene = CTX_data_scene(DST.context); + RenderEngineSettings *rs = NULL; - if (STREQ(scene->r.engine, RE_engine_id_BLENDER_CLAY)) - return &scene->claydata; + if (scene == NULL) + scene = CTX_data_scene(DST.context); - BLI_assert(false); - return NULL; + rs = BLI_findstring(&scene->engines_settings, engine_name, offsetof(RenderEngineSettings, name)); + + /* If the settings does not exists yet, create it */ + if (rs == NULL) { + /* TODO make render_settings_create a polymorphic function */ + if (STREQ(engine_name, RE_engine_id_BLENDER_CLAY)) { + rs = CLAY_render_settings_create(); + } + + BLI_addtail(&scene->engines_settings, rs); + } + + return rs; } /* ****************************************** Framebuffers ******************************************/ diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 97e7c664ae7..7afeb26736c 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -90,8 +90,17 @@ typedef struct TexPaintSlot { int pad; } TexPaintSlot; -/* Runtime Render Data Not saved in file */ -typedef struct MaterialDataClayRuntime { +/* Material Engine Settings */ +typedef struct MaterialEngineSettings { + struct MaterialEngineSettings *next, *prev; + char name[64]; /* engine name - MAX_NAME */ + void *runtime; /* To be free on file read */ +} MaterialEngineSettings; + +/* Clay engine */ + +/* Runtime Data Not saved in file */ +typedef struct MaterialRuntimeClay { short type; short flag; int material_id; /* Index in materials UBO */ @@ -99,14 +108,13 @@ typedef struct MaterialDataClayRuntime { float matcap_rot[2]; float matcap_hsv[3]; float ssao_params_var[4]; -} MaterialDataClayRuntime; +} MaterialRuntimeClay; -/* MaterialDataClayRuntime.flag */ +/* MaterialRuntimeClay.flag */ #define CLAY_OUTDATED 1 -/* Duplicated in DNA_scene_types.h under SceneSettingsClay */ -typedef struct MaterialSettingsClay { - struct MaterialDataClayRuntime *runtime; +typedef struct MaterialEngineSettingsClay { + struct MaterialEngineSettings mes; /* keep first */ short type; short matcap_icon; /* Icon ID */ @@ -122,9 +130,9 @@ typedef struct MaterialSettingsClay { float ssao_factor_edge; float pad; -} MaterialSettingsClay; +} MaterialEngineSettingsClay; -/* MaterialSettingsClay.type */ +/* MaterialEngineSettingsClay.type */ #define CLAY_MATCAP_NONE 0 #define CLAY_MATCAP_SIMPLE 1 #define CLAY_MATCAP_COMPLETE 2 @@ -243,8 +251,7 @@ typedef struct Material { struct TexPaintSlot *texpaintslot; /* cached slot for painting. Make sure to recalculate before use * with refresh_texpaint_image_cache */ /* Engine Settings */ - struct MaterialSettingsClay clay; - float pad6[2]; + ListBase engines_settings; /* MaterialEngineSettings */ ListBase gpumaterial; /* runtime */ } Material; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 3759aa3d48b..b89c6709f0b 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -68,7 +68,6 @@ struct bGPDbrush; struct MovieClip; struct ColorSpace; struct SceneCollection; -struct MaterialSettingsClay; /* ************************************************************* */ /* Scene Data */ @@ -547,6 +546,50 @@ typedef enum BakePassFilter { #define R_BAKE_PASS_FILTER_ALL (~0) /* *************************************************************** */ +/* Engine Settings */ + +typedef struct RenderEngineSettings { + struct RenderEngineSettings *next, *prev; + char name[64]; /* engine name - MAX_NAME */ + void *runtime; /* Here to be free on file read */ +} RenderEngineSettings; + +/* Render Data */ +typedef struct RenderEngineSettingsClay { + struct RenderEngineSettings res; /* keep first */ + + /* Use same layout as MaterialEngineSettingsClay so this struct + * can be used as Material Settings. */ + short type; + short matcap_icon; /* Icon ID */ + + float matcap_rot; + float matcap_hue; + float matcap_sat; + float matcap_val; + + float ssao_distance; + float ssao_attenuation; + float ssao_factor_cavity; + float ssao_factor_edge; + + float pad; + /* end of MaterialEngineSettingsClay */ + + /* Global Settings */ + short options; + short pad1; + int ssao_samples; + int pad2[2]; +} RenderEngineSettingsClay; + +/* RenderEngineSettingsClay.options */ +typedef enum ClayFlagSettings { + CLAY_USE_AO = (1 << 0), + CLAY_USE_HSV = (1 << 1), +} ClayFlagSettings; + +/* *************************************************************** */ /* Render Data */ typedef struct RenderData { @@ -794,44 +837,6 @@ typedef struct RenderProfile { } RenderProfile; /* *************************************************************** */ -/* Clay Engine */ - -/* Duplicated in DNA_material_types.h under MaterialSettingsClay */ -typedef struct SceneSettingsClay { - struct MaterialDataClayRuntime *runtime; - - short type; - short matcap_icon; /* Icon ID */ - - float matcap_rot; - float matcap_hue; - float matcap_sat; - float matcap_val; - - float ssao_distance; - float ssao_attenuation; - float ssao_factor_cavity; - float ssao_factor_edge; - - float pad; -} SceneSettingsClay; - -/* Render Data */ -typedef struct EngineDataClay { - /* Default Matcap settings */ - struct SceneSettingsClay defsettings; - short options; - short pad; - /* Global Settings */ - int ssao_samples; - int pad2[2]; -} EngineDataClay; - -/* EngineDataClay.options */ -#define CLAY_USE_AO 1 -#define CLAY_USE_HSV 2 - -/* *************************************************************** */ /* Game Engine - Dome */ typedef struct GameDome { @@ -1754,9 +1759,8 @@ typedef struct Scene { int active_layer; int pad4; - /* Engine Settings */ - struct EngineDataClay claydata; - short pad10[4]; + ListBase engines_settings; /* RenderEngineSettings */ + int pad5[2]; } Scene; /* **************** RENDERDATA ********************* */ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 448e5901ec8..b81806942f7 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -498,6 +498,8 @@ extern StructRNA RNA_RenderLayer; extern StructRNA RNA_RenderPass; extern StructRNA RNA_RenderResult; extern StructRNA RNA_RenderSettings; +extern StructRNA RNA_RenderEngineSettings; +extern StructRNA RNA_RenderEngineSettingsClay; extern StructRNA RNA_RigidBodyWorld; extern StructRNA RNA_RigidBodyObject; extern StructRNA RNA_RigidBodyJointConstraint; diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 0f3ea27a7f9..608d4781e60 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -341,6 +341,7 @@ blender_include_dirs( ../../bmesh ../../blentranslation ../../depsgraph + ../../draw ../../gpu ../../imbuf ../../ikplugin diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 950983dda31..e477cca0e5c 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -123,17 +123,6 @@ static void rna_Material_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, ma); } -static void rna_Material_update_engine_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) -{ - Material *ma = ptr->id.data; - - if (ma->clay.runtime) { - ma->clay.runtime->flag |= CLAY_OUTDATED; - } - - WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, ma); -} - static PointerRNA rna_Material_mirror_get(PointerRNA *ptr) { return rna_pointer_inherit_refine(ptr, &RNA_MaterialRaytraceMirror, ptr->id.data); @@ -875,8 +864,8 @@ static void rna_def_material_settings_clay(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; - srna = RNA_def_struct(brna, "ClayMaterialSettings", NULL); - RNA_def_struct_sdna(srna, "MaterialSettingsClay"); + srna = RNA_def_struct(brna, "MaterialSettingsClay", NULL); + RNA_def_struct_sdna(srna, "MaterialEngineSettingsClay"); RNA_def_struct_nested(brna, srna, "Material"); RNA_def_struct_ui_text(srna, "Material Clay Settings", "Clay Engine settings for a Material data-block"); @@ -2199,13 +2188,14 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_struct_type(prop, "MaterialGameSettings"); RNA_def_property_ui_text(prop, "Game Settings", "Game material settings"); - /* Clay settings */ + /* Engine settings */ +#if 0 /* TODO */ prop = RNA_def_property(srna, "clay_settings", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "clay"); RNA_def_property_struct_type(prop, "ClayMaterialSettings"); RNA_def_property_ui_text(prop, "Clay Settings", "Clay material settings"); - +#endif /* nodetree */ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "nodetree"); @@ -2255,7 +2245,7 @@ void RNA_def_material(BlenderRNA *brna) rna_def_material_strand(brna); rna_def_material_physics(brna); rna_def_material_gamesettings(brna); - rna_def_material_settings_clay(brna); + // rna_def_material_settings_clay(brna); RNA_api_material(srna); } diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 3b599dedfca..660942fbfda 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -52,6 +52,8 @@ #include "GPU_extensions.h" +#include "DRW_engine.h" + #include "RNA_define.h" #include "RNA_enum_types.h" @@ -947,6 +949,34 @@ static void rna_Scene_all_keyingsets_next(CollectionPropertyIterator *iter) iter->valid = (internal->link != NULL); } +static StructRNA *rna_Scene_render_engine_typef(PointerRNA *ptr) +{ + Scene *scene = (Scene *)ptr->data; + + if (STREQ(scene->r.engine, RE_engine_id_BLENDER_CLAY)) { + return &RNA_RenderEngineSettingsClay; + } + + return &RNA_RenderEngineSettings; +} + +static PointerRNA rna_Scene_render_engine_get(PointerRNA *ptr) +{ + Scene *scene = (Scene *)ptr->data; + RenderEngineSettings *res = DRW_render_settings_get(scene, scene->r.engine); + + if (STREQ(scene->r.engine, RE_engine_id_BLENDER_CLAY)) { + return rna_pointer_inherit_refine(ptr, &RNA_RenderEngineSettingsClay, res); + } + + return rna_pointer_inherit_refine(ptr, &RNA_RenderEngineSettings, res); +} + +static char *rna_RenderEngineSettings_path(PointerRNA *UNUSED(ptr)) +{ + return BLI_sprintfN("render_engine"); +} + static int rna_RenderSettings_stereoViews_skip(CollectionPropertyIterator *iter, void *UNUSED(data)) { ListBaseIterator *internal = &iter->internal.listbase; @@ -1872,15 +1902,15 @@ static void rna_GameSettings_exit_key_set(PointerRNA *ptr, int value) gm->exitkey = value; } -static void rna_ClaySettings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +static void rna_RenderEngineSettings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { Scene *sce = ptr->id.data; - EngineDataClay *ed = &sce->claydata; - SceneSettingsClay *ms = &ed->defsettings; - MaterialDataClayRuntime *mdr = ms->runtime; + RenderEngineSettings *ed = DRW_render_settings_get(sce, sce->r.engine); - if (mdr) - mdr->flag |= CLAY_OUTDATED; + if (ed->runtime) { + MEM_freeN(ed->runtime); + ed->runtime = NULL; + } WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, NULL); } @@ -6545,11 +6575,10 @@ static void rna_def_scene_quicktime_settings(BlenderRNA *brna) } #endif -static void rna_def_material_settings_clay(BlenderRNA *brna) +static void rna_def_render_engine_settings_clay(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem clay_matcap_items[] = { {ICON_MATCAP_01, "01", ICON_MATCAP_01, "", ""}, {ICON_MATCAP_02, "02", ICON_MATCAP_02, "", ""}, @@ -6578,85 +6607,77 @@ static void rna_def_material_settings_clay(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; - srna = RNA_def_struct(brna, "ClayRenderMaterialSettings", NULL); - RNA_def_struct_sdna(srna, "SceneSettingsClay"); - RNA_def_struct_nested(brna, srna, "ClayRenderSettings"); + srna = RNA_def_struct(brna, "RenderEngineSettingsClay", NULL); + RNA_def_struct_nested(brna, srna, "Scene"); RNA_def_struct_ui_text(srna, "Material Clay Settings", "Clay Engine settings for a Material data-block"); prop = RNA_def_property(srna, "matcap_icon", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, clay_matcap_items); RNA_def_property_ui_text(prop, "Matcap", "Image to use for Material Capture by this material"); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "matcap_rotation", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "matcap_rot"); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Rotation", "Orientation of the matcap on the model"); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "matcap_hue", PROP_FLOAT, PROP_FACTOR); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Hue shift", "Hue correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "matcap_saturation", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "matcap_sat"); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Saturation", "Saturation correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "matcap_value", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "matcap_val"); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Matcap Value", "Value correction of the matcap"); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "ssao_factor_cavity", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Cavity Strength", "Strength of the Cavity effect"); RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "ssao_factor_edge", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Edge Strength", "Strength of the Edge effect"); RNA_def_property_range(prop, 0.0f, 250.0f); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "ssao_distance", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Distance", "Distance of object that contribute to the Cavity/Edge effect"); RNA_def_property_range(prop, 0.0f, 100000.0f); RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); prop = RNA_def_property(srna, "ssao_attenuation", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Attenuation", "Attenuation constant"); RNA_def_property_range(prop, 1.0f, 100000.0f); RNA_def_property_ui_range(prop, 1.0f, 100.0f, 1, 3); - RNA_def_property_update(prop, 0, "rna_ClaySettings_update"); -} - -static void rna_def_clay_data(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "ClayRenderSettings", NULL); - RNA_def_struct_sdna(srna, "EngineDataClay"); - RNA_def_struct_nested(brna, srna, "Scene"); - RNA_def_struct_ui_text(srna, "Render Clay Settings", "Clay Engine settings for a Scene data-block"); + RNA_def_property_update(prop, 0, "rna_RenderEngineSettings_update"); /* Clay settings */ - prop = RNA_def_property(srna, "mat_settings", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "defsettings"); - RNA_def_property_struct_type(prop, "ClayRenderMaterialSettings"); - RNA_def_property_ui_text(prop, "Clay Settings", "Clay default material settings"); - prop = RNA_def_property(srna, "ssao_samples", PROP_INT, PROP_NONE); RNA_def_property_ui_text(prop, "Samples", "Number of samples"); RNA_def_property_range(prop, 1, 500); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); +} + +static void rna_def_scene_render_engine(BlenderRNA *brna) +{ + StructRNA *srna; + + srna = RNA_def_struct(brna, "RenderEngineSettings", NULL); + RNA_def_struct_nested(brna, srna, "Scene"); + RNA_def_struct_path_func(srna, "rna_RenderEngineSettings_path"); + RNA_def_struct_ui_text(srna, "Render Engine Data", ""); - rna_def_material_settings_clay(brna); + rna_def_render_engine_settings_clay(brna); } static void rna_def_scene_render_data(BlenderRNA *brna) @@ -8155,12 +8176,12 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_struct_type(prop, "RenderSettings"); RNA_def_property_ui_text(prop, "Render Data", ""); - /* Engines Data */ - prop = RNA_def_property(srna, "clay_settings", PROP_POINTER, PROP_NONE); + /* Render Engine Data */ + prop = RNA_def_property(srna, "render_engine", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "claydata"); - RNA_def_property_struct_type(prop, "ClayRenderSettings"); - RNA_def_property_ui_text(prop, "Clay Settings", "Clay Engine settings"); + RNA_def_property_pointer_funcs(prop, "rna_Scene_render_engine_get", NULL, "rna_Scene_render_engine_typef", NULL); + RNA_def_property_struct_type(prop, "RenderEngineSettings"); + RNA_def_property_ui_text(prop, "Render Engine Data", ""); /* Safe Areas */ prop = RNA_def_property(srna, "safe_areas", PROP_POINTER, PROP_NONE); @@ -8312,8 +8333,8 @@ void RNA_def_scene(BlenderRNA *brna) RNA_define_animate_sdna(true); /* *** Animated *** */ rna_def_scene_render_data(brna); + rna_def_scene_render_engine(brna); rna_def_scene_render_layer(brna); - rna_def_clay_data(brna); rna_def_gpu_fx(brna); rna_def_scene_render_view(brna); |