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
path: root/source
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2018-02-28 19:54:00 +0300
committerDalai Felinto <dfelinto@gmail.com>2018-02-28 19:55:56 +0300
commit382218beb29f52e1ea5c10803edf95a937878308 (patch)
treef435025a91e8cce8627898f2f269db4fa48a6f3b /source
parent4a892adac5937fdaa19d0309e5195a83bdb14e72 (diff)
Point cache: Pass EvaluationContext for all the related functions
Now the only missing bit seems to be in Cycles to pass depsgraph to builtin_image_float_pixels(). Ideally we could get evaluation context instead of using depsgraph + settings. But for the other rna EvaluationContext functions this is how we are doing. Reviewers: sergey, brecht Differential Revision: https://developer.blender.org/D3087
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/DEG_depsgraph.h5
-rw-r--r--source/blender/depsgraph/intern/depsgraph_eval.cc16
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c56
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h14
-rw-r--r--source/blender/render/intern/source/pointdensity.c43
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c6
6 files changed, 78 insertions, 62 deletions
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h
index e96ef847137..477c0dd36ea 100644
--- a/source/blender/depsgraph/DEG_depsgraph.h
+++ b/source/blender/depsgraph/DEG_depsgraph.h
@@ -230,6 +230,11 @@ void DEG_evaluation_context_init_from_view_layer_for_render(
struct Scene *scene,
struct ViewLayer *view_layer);
+void DEG_evaluation_context_init_from_depsgraph(
+ struct EvaluationContext *eval_ctx,
+ struct Depsgraph *depsgraph,
+ eEvaluationMode mode);
+
/* Free evaluation context. */
void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx);
diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc
index ddb049a0043..d76eba29628 100644
--- a/source/blender/depsgraph/intern/depsgraph_eval.cc
+++ b/source/blender/depsgraph/intern/depsgraph_eval.cc
@@ -39,10 +39,12 @@
extern "C" {
#include "BKE_scene.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
} /* extern "C" */
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "intern/eval/deg_eval.h"
#include "intern/eval/deg_eval_flush.h"
@@ -111,6 +113,20 @@ void DEG_evaluation_context_init_from_view_layer_for_render(
eval_ctx->engine_type = NULL;
}
+void DEG_evaluation_context_init_from_depsgraph(
+ EvaluationContext *eval_ctx,
+ Depsgraph *depsgraph,
+ eEvaluationMode mode)
+{
+ Scene *scene = DEG_get_evaluated_scene(depsgraph);
+ DEG_evaluation_context_init(eval_ctx, mode);
+ eval_ctx->ctime = (float)scene->r.cfra + scene->r.subframe;
+ eval_ctx->object_mode = OB_MODE_OBJECT;
+ eval_ctx->depsgraph = depsgraph;
+ eval_ctx->view_layer = DEG_get_evaluated_view_layer(depsgraph);
+ eval_ctx->engine_type = NULL;
+}
+
/* Free evaluation context. */
void DEG_evaluation_context_free(EvaluationContext *eval_ctx)
{
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 2a9e94964e4..55ae7fdb6af 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -3134,16 +3134,22 @@ static int point_density_vertex_color_source_from_shader(NodeShaderTexPointDensi
}
void rna_ShaderNodePointDensity_density_cache(bNode *self,
- Scene *scene,
- ViewLayer *view_layer,
+ Depsgraph *depsgraph,
int settings)
{
NodeShaderTexPointDensity *shader_point_density = self->storage;
PointDensity *pd = &shader_point_density->pd;
- if (scene == NULL) {
+
+ if (depsgraph == NULL) {
return;
}
+ EvaluationContext eval_ctx;
+ DEG_evaluation_context_init_from_depsgraph(&eval_ctx,
+ depsgraph,
+ settings == 1 ? DAG_EVAL_RENDER :
+ DAG_EVAL_VIEWPORT);
+
/* Make sure there's no cached data. */
BKE_texture_pointdensity_free_data(pd);
RE_point_density_free(pd);
@@ -3172,14 +3178,12 @@ void rna_ShaderNodePointDensity_density_cache(bNode *self,
shader_point_density->cached_resolution = shader_point_density->resolution;
/* Single-threaded sampling of the voxel domain. */
- RE_point_density_cache(scene,
- view_layer, pd,
- settings == 1);
+ RE_point_density_cache(&eval_ctx,
+ pd);
}
void rna_ShaderNodePointDensity_density_calc(bNode *self,
- Scene *scene,
- ViewLayer *view_layer,
+ Depsgraph *depsgraph,
int settings,
int *length,
float **values)
@@ -3188,11 +3192,17 @@ void rna_ShaderNodePointDensity_density_calc(bNode *self,
PointDensity *pd = &shader_point_density->pd;
const int resolution = shader_point_density->cached_resolution;
- if (scene == NULL) {
+ if (depsgraph == NULL) {
*length = 0;
return;
}
+ EvaluationContext eval_ctx;
+ DEG_evaluation_context_init_from_depsgraph(&eval_ctx,
+ depsgraph,
+ settings == 1 ? DAG_EVAL_RENDER :
+ DAG_EVAL_VIEWPORT);
+
/* TODO(sergey): Will likely overflow, but how to pass size_t via RNA? */
*length = 4 * resolution * resolution * resolution;
@@ -3201,9 +3211,9 @@ void rna_ShaderNodePointDensity_density_calc(bNode *self,
}
/* Single-threaded sampling of the voxel domain. */
- RE_point_density_sample(scene, view_layer, pd,
+ RE_point_density_sample(&eval_ctx,
+ pd,
resolution,
- settings == 1,
*values);
/* We're done, time to clean up. */
@@ -3213,20 +3223,27 @@ void rna_ShaderNodePointDensity_density_calc(bNode *self,
}
void rna_ShaderNodePointDensity_density_minmax(bNode *self,
- Scene *scene,
- ViewLayer *view_layer,
+ Depsgraph *depsgraph,
int settings,
float r_min[3],
float r_max[3])
{
NodeShaderTexPointDensity *shader_point_density = self->storage;
PointDensity *pd = &shader_point_density->pd;
- if (scene == NULL) {
+
+ if (depsgraph == NULL) {
zero_v3(r_min);
zero_v3(r_max);
return;
}
- RE_point_density_minmax(scene, view_layer, pd, settings == 1, r_min, r_max);
+
+ EvaluationContext eval_ctx;
+ DEG_evaluation_context_init_from_depsgraph(&eval_ctx,
+ depsgraph,
+ settings == 1 ? DAG_EVAL_RENDER :
+ DAG_EVAL_VIEWPORT);
+
+ RE_point_density_minmax(&eval_ctx, pd, r_min, r_max);
}
#else
@@ -4216,14 +4233,12 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
func = RNA_def_function(srna, "cache_point_density", "rna_ShaderNodePointDensity_density_cache");
RNA_def_function_ui_description(func, "Cache point density data for later calculation");
- RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_enum(func, "settings", calc_mode_items, 1, "", "Calculate density for rendering");
func = RNA_def_function(srna, "calc_point_density", "rna_ShaderNodePointDensity_density_calc");
RNA_def_function_ui_description(func, "Calculate point density");
- RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_enum(func, "settings", calc_mode_items, 1, "", "Calculate density for rendering");
/* TODO, See how array size of 0 works, this shouldnt be used. */
parm = RNA_def_float_array(func, "rgba_values", 1, NULL, 0, 0, "", "RGBA Values", 0, 0);
@@ -4232,8 +4247,7 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
func = RNA_def_function(srna, "calc_point_density_minmax", "rna_ShaderNodePointDensity_density_minmax");
RNA_def_function_ui_description(func, "Calculate point density");
- RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_enum(func, "settings", calc_mode_items, 1, "", "Calculate density for rendering");
parm = RNA_def_property(func, "min", PROP_FLOAT, PROP_COORDS);
RNA_def_property_array(parm, 3);
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 4e3430c2892..1a1f455712e 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -72,24 +72,18 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove);
struct PointDensity;
void RE_point_density_cache(
- struct Scene *scene,
- struct ViewLayer *view_layer,
- struct PointDensity *pd,
- const bool use_render_params);
+ const struct EvaluationContext *eval_ctx,
+ struct PointDensity *pd);
void RE_point_density_minmax(
- struct Scene *scene,
- struct ViewLayer *view_layer,
+ const struct EvaluationContext *eval_ctx,
struct PointDensity *pd,
- const bool use_render_params,
float r_min[3], float r_max[3]);
void RE_point_density_sample(
- struct Scene *scene,
- struct ViewLayer *view_layer,
+ const struct EvaluationContext *eval_ctx,
struct PointDensity *pd,
const int resolution,
- const bool use_render_params,
float *values);
void RE_point_density_free(struct PointDensity *pd);
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index 71145cfa4b7..49738aa5f96 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -59,6 +59,7 @@
#include "BKE_colortools.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "render_types.h"
#include "texture.h"
@@ -882,7 +883,7 @@ static void sample_dummy_point_density(int resolution, float *values)
memset(values, 0, sizeof(float) * 4 * resolution * resolution * resolution);
}
-static void particle_system_minmax(EvaluationContext *eval_ctx,
+static void particle_system_minmax(const EvaluationContext *eval_ctx,
Scene *scene,
Object *object,
ParticleSystem *psys,
@@ -945,33 +946,30 @@ static void particle_system_minmax(EvaluationContext *eval_ctx,
}
void RE_point_density_cache(
- Scene *scene,
- ViewLayer *view_layer,
- PointDensity *pd,
- const bool use_render_params)
+ const struct EvaluationContext *eval_ctx,
+ PointDensity *pd)
{
- EvaluationContext eval_ctx = {0};
float mat[4][4];
+ const bool use_render_params = (eval_ctx->mode == DAG_EVAL_RENDER);
- DEG_evaluation_context_init(&eval_ctx, use_render_params ? DAG_EVAL_RENDER
- : DAG_EVAL_VIEWPORT);
-
- eval_ctx.view_layer = view_layer;
+ Depsgraph *depsgraph = eval_ctx->depsgraph;
+ Scene *scene = DEG_get_evaluated_scene(depsgraph);
/* Same matricies/resolution as dupli_render_particle_set(). */
unit_m4(mat);
BLI_mutex_lock(&sample_mutex);
- cache_pointdensity_ex(&eval_ctx, scene, pd, mat, mat, 1, 1, use_render_params);
+ cache_pointdensity_ex(eval_ctx, scene, pd, mat, mat, 1, 1, use_render_params);
BLI_mutex_unlock(&sample_mutex);
}
void RE_point_density_minmax(
- struct Scene *scene,
- ViewLayer *view_layer,
+ const struct EvaluationContext *eval_ctx,
struct PointDensity *pd,
- const bool use_render_params,
float r_min[3], float r_max[3])
{
+ const bool use_render_params = (eval_ctx->mode == DAG_EVAL_RENDER);
+ Depsgraph *depsgraph = eval_ctx->depsgraph;
+ Scene *scene = DEG_get_evaluated_scene(depsgraph);
Object *object = pd->object;
if (object == NULL) {
zero_v3(r_min);
@@ -980,7 +978,6 @@ void RE_point_density_minmax(
}
if (pd->source == TEX_PD_PSYS) {
ParticleSystem *psys;
- EvaluationContext eval_ctx = {0};
if (pd->psys == 0) {
zero_v3(r_min);
@@ -994,13 +991,7 @@ void RE_point_density_minmax(
return;
}
- DEG_evaluation_context_init(&eval_ctx, use_render_params ? DAG_EVAL_RENDER :
- DAG_EVAL_VIEWPORT);
-
- eval_ctx.ctime = (float)scene->r.cfra + scene->r.subframe;
- eval_ctx.view_layer = view_layer;
-
- particle_system_minmax(&eval_ctx,
+ particle_system_minmax(eval_ctx,
scene,
object,
psys,
@@ -1073,11 +1064,9 @@ static void point_density_sample_func(
* NOTE 2: Frees point density structure after sampling.
*/
void RE_point_density_sample(
- Scene *scene,
- ViewLayer *view_layer,
+ const EvaluationContext *eval_ctx,
PointDensity *pd,
const int resolution,
- const bool use_render_params,
float *values)
{
Object *object = pd->object;
@@ -1093,10 +1082,8 @@ void RE_point_density_sample(
}
BLI_mutex_lock(&sample_mutex);
- RE_point_density_minmax(scene,
- view_layer,
+ RE_point_density_minmax(eval_ctx,
pd,
- use_render_params,
min,
max);
BLI_mutex_unlock(&sample_mutex);
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 894bad1ab8a..f681a3544c3 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -766,9 +766,9 @@ void RE_engine_update_memory_stats(struct RenderEngine *engine, float mem_used,
struct RenderEngine *RE_engine_create(struct RenderEngineType *type) RET_NULL
void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe) RET_NONE
void RE_FreePersistentData(void) RET_NONE
-void RE_point_density_cache(struct Scene *scene, struct ViewLayer *view_layer, struct PointDensity *pd, const bool use_render_params) RET_NONE
-void RE_point_density_minmax(struct Scene *scene, struct ViewLayer *view_layer, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]) RET_NONE
-void RE_point_density_sample(struct Scene *scene, struct ViewLayer *view_layer, struct PointDensity *pd, const int resolution, const bool use_render_params, float *values) RET_NONE
+void RE_point_density_cache(const struct EvaluationContext *eval_ctx, struct PointDensity *pd) RET_NONE
+void RE_point_density_minmax(const struct EvaluationContext *eval_ctx, struct PointDensity *pd, float r_min[3], float r_max[3]) RET_NONE
+void RE_point_density_sample(const struct EvaluationContext *eval_ctx, struct PointDensity *pd, const int resolution, float *values) RET_NONE
void RE_point_density_free(struct PointDensity *pd) RET_NONE
void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, float *random, float *age, float *lifetime, float co[3], float *size, float vel[3], float angvel[3]) RET_NONE
void RE_FreeAllPersistentData(void) RET_NONE