Cycles: Fix for point density always using render settings for modifiers
This commit is contained in:
@@ -1194,7 +1194,8 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
|||||||
if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
|
if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
|
||||||
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
|
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
|
||||||
int length;
|
int length;
|
||||||
b_point_density_node.calc_point_density(b_scene, &length, &pixels);
|
int settings = background ? 1 : 0; /* 1 - render settings, 0 - vewport settings. */
|
||||||
|
b_point_density_node.calc_point_density(b_scene, settings, &length, &pixels);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3019,7 +3019,11 @@ static int point_density_color_source_from_shader(NodeShaderTexPointDensity *sha
|
|||||||
/* TODO(sergey): This function assumes allocated array was passed,
|
/* TODO(sergey): This function assumes allocated array was passed,
|
||||||
* works fine with Cycles via C++ RNA, but fails with call from python.
|
* works fine with Cycles via C++ RNA, but fails with call from python.
|
||||||
*/
|
*/
|
||||||
void rna_ShaderNodePointDensity_density_calc(bNode *self, Scene *scene, int *length, float **values)
|
void rna_ShaderNodePointDensity_density_calc(bNode *self,
|
||||||
|
Scene *scene,
|
||||||
|
int settings,
|
||||||
|
int *length,
|
||||||
|
float **values)
|
||||||
{
|
{
|
||||||
NodeShaderTexPointDensity *shader_point_density = self->storage;
|
NodeShaderTexPointDensity *shader_point_density = self->storage;
|
||||||
PointDensity pd;
|
PointDensity pd;
|
||||||
@@ -3051,6 +3055,7 @@ void rna_ShaderNodePointDensity_density_calc(bNode *self, Scene *scene, int *len
|
|||||||
/* Single-threaded sampling of the voxel domain. */
|
/* Single-threaded sampling of the voxel domain. */
|
||||||
RE_sample_point_density(scene, &pd,
|
RE_sample_point_density(scene, &pd,
|
||||||
shader_point_density->resolution,
|
shader_point_density->resolution,
|
||||||
|
settings == 1,
|
||||||
*values);
|
*values);
|
||||||
|
|
||||||
/* We're done, time to clean up. */
|
/* We're done, time to clean up. */
|
||||||
@@ -3934,6 +3939,13 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
|
|||||||
{0, NULL, 0, NULL, NULL}
|
{0, NULL, 0, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* TODO(sergey): Use some mnemonic names for the hardcoded values here. */
|
||||||
|
static EnumPropertyItem calc_mode_items[] = {
|
||||||
|
{0, "VIEWPORT", 0, "Viewport", "Canculate density using viewport settings"},
|
||||||
|
{1, "RENDER", 0, "Render", "Canculate duplis using render settings"},
|
||||||
|
{0, NULL, 0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
|
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
|
||||||
RNA_def_property_pointer_sdna(prop, NULL, "id");
|
RNA_def_property_pointer_sdna(prop, NULL, "id");
|
||||||
RNA_def_property_struct_type(prop, "Object");
|
RNA_def_property_struct_type(prop, "Object");
|
||||||
@@ -3986,6 +3998,7 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
|
|||||||
func = RNA_def_function(srna, "calc_point_density", "rna_ShaderNodePointDensity_density_calc");
|
func = RNA_def_function(srna, "calc_point_density", "rna_ShaderNodePointDensity_density_calc");
|
||||||
RNA_def_function_ui_description(func, "Calculate point density");
|
RNA_def_function_ui_description(func, "Calculate point density");
|
||||||
RNA_def_pointer(func, "scene", "Scene", "", "");
|
RNA_def_pointer(func, "scene", "Scene", "", "");
|
||||||
|
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. */
|
/* TODO, See how array size of 0 works, this shouldnt be used. */
|
||||||
prop = RNA_def_float_array(func, "rgba_values", 1, NULL, 0, 0, "", "RGBA Values", 0, 0);
|
prop = RNA_def_float_array(func, "rgba_values", 1, NULL, 0, 0, "", "RGBA Values", 0, 0);
|
||||||
RNA_def_property_flag(prop, PROP_DYNAMIC);
|
RNA_def_property_flag(prop, PROP_DYNAMIC);
|
||||||
|
@@ -63,7 +63,11 @@ void RE_sample_material_color(
|
|||||||
|
|
||||||
struct PointDensity;
|
struct PointDensity;
|
||||||
|
|
||||||
void RE_sample_point_density(struct Scene *scene, struct PointDensity *pd, int resolution, float *values);
|
void RE_sample_point_density(struct Scene *scene,
|
||||||
|
struct PointDensity *pd,
|
||||||
|
const int resolution,
|
||||||
|
const bool use_render_params,
|
||||||
|
float *values);
|
||||||
|
|
||||||
void RE_init_texture_rng(void);
|
void RE_init_texture_rng(void);
|
||||||
void RE_exit_texture_rng(void);
|
void RE_exit_texture_rng(void);
|
||||||
|
@@ -121,7 +121,8 @@ static void pointdensity_cache_psys(Scene *scene,
|
|||||||
ParticleSystem *psys,
|
ParticleSystem *psys,
|
||||||
float viewmat[4][4],
|
float viewmat[4][4],
|
||||||
float winmat[4][4],
|
float winmat[4][4],
|
||||||
int winx, int winy)
|
int winx, int winy,
|
||||||
|
const bool use_render_params)
|
||||||
{
|
{
|
||||||
DerivedMesh *dm;
|
DerivedMesh *dm;
|
||||||
ParticleKey state;
|
ParticleKey state;
|
||||||
@@ -140,9 +141,20 @@ static void pointdensity_cache_psys(Scene *scene,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Just to create a valid rendering context for particles */
|
/* Just to create a valid rendering context for particles */
|
||||||
psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0);
|
if (use_render_params) {
|
||||||
|
psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0);
|
||||||
|
}
|
||||||
|
|
||||||
dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
if (use_render_params) {
|
||||||
|
dm = mesh_create_derived_render(scene,
|
||||||
|
ob,
|
||||||
|
CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dm = mesh_get_derived_final(scene,
|
||||||
|
ob,
|
||||||
|
CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
||||||
|
}
|
||||||
|
|
||||||
if ( !psys_check_enabled(ob, psys)) {
|
if ( !psys_check_enabled(ob, psys)) {
|
||||||
psys_render_restore(ob, psys);
|
psys_render_restore(ob, psys);
|
||||||
@@ -240,17 +252,32 @@ static void pointdensity_cache_psys(Scene *scene,
|
|||||||
psys->lattice_deform_data = NULL;
|
psys->lattice_deform_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
psys_render_restore(ob, psys);
|
if (use_render_params) {
|
||||||
|
psys_render_restore(ob, psys);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void pointdensity_cache_object(Scene *scene, PointDensity *pd, Object *ob)
|
static void pointdensity_cache_object(Scene *scene,
|
||||||
|
PointDensity *pd,
|
||||||
|
Object *ob,
|
||||||
|
const bool use_render_params)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
DerivedMesh *dm;
|
DerivedMesh *dm;
|
||||||
MVert *mvert = NULL;
|
MVert *mvert = NULL;
|
||||||
|
|
||||||
dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
if (use_render_params) {
|
||||||
|
dm = mesh_create_derived_render(scene,
|
||||||
|
ob,
|
||||||
|
CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dm = mesh_get_derived_final(scene,
|
||||||
|
ob,
|
||||||
|
CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
|
||||||
|
|
||||||
|
}
|
||||||
mvert = dm->getVertArray(dm); /* local object space */
|
mvert = dm->getVertArray(dm); /* local object space */
|
||||||
|
|
||||||
pd->totpoints = dm->getNumVerts(dm);
|
pd->totpoints = dm->getNumVerts(dm);
|
||||||
@@ -290,7 +317,8 @@ static void cache_pointdensity_ex(Scene *scene,
|
|||||||
PointDensity *pd,
|
PointDensity *pd,
|
||||||
float viewmat[4][4],
|
float viewmat[4][4],
|
||||||
float winmat[4][4],
|
float winmat[4][4],
|
||||||
int winx, int winy)
|
int winx, int winy,
|
||||||
|
const bool use_render_params)
|
||||||
{
|
{
|
||||||
if (pd == NULL) {
|
if (pd == NULL) {
|
||||||
return;
|
return;
|
||||||
@@ -314,18 +342,28 @@ static void cache_pointdensity_ex(Scene *scene,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pointdensity_cache_psys(scene, pd, ob, psys, viewmat, winmat, winx, winy);
|
pointdensity_cache_psys(scene,
|
||||||
|
pd,
|
||||||
|
ob,
|
||||||
|
psys,
|
||||||
|
viewmat, winmat,
|
||||||
|
winx, winy,
|
||||||
|
use_render_params);
|
||||||
}
|
}
|
||||||
else if (pd->source == TEX_PD_OBJECT) {
|
else if (pd->source == TEX_PD_OBJECT) {
|
||||||
Object *ob = pd->object;
|
Object *ob = pd->object;
|
||||||
if (ob && ob->type == OB_MESH)
|
if (ob && ob->type == OB_MESH)
|
||||||
pointdensity_cache_object(scene, pd, ob);
|
pointdensity_cache_object(scene, pd, ob, use_render_params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cache_pointdensity(Render *re, PointDensity *pd)
|
void cache_pointdensity(Render *re, PointDensity *pd)
|
||||||
{
|
{
|
||||||
cache_pointdensity_ex(re->scene, pd, re->viewmat, re->winmat, re->winx, re->winy);
|
cache_pointdensity_ex(re->scene,
|
||||||
|
pd,
|
||||||
|
re->viewmat, re->winmat,
|
||||||
|
re->winx, re->winy,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_pointdensity(PointDensity *pd)
|
void free_pointdensity(PointDensity *pd)
|
||||||
@@ -621,6 +659,7 @@ static void particle_system_minmax(Scene *scene,
|
|||||||
Object *object,
|
Object *object,
|
||||||
ParticleSystem *psys,
|
ParticleSystem *psys,
|
||||||
float radius,
|
float radius,
|
||||||
|
const bool use_render_params,
|
||||||
float min[3], float max[3])
|
float min[3], float max[3])
|
||||||
{
|
{
|
||||||
const float size[3] = {radius, radius, radius};
|
const float size[3] = {radius, radius, radius};
|
||||||
@@ -639,7 +678,9 @@ static void particle_system_minmax(Scene *scene,
|
|||||||
}
|
}
|
||||||
|
|
||||||
unit_m4(mat);
|
unit_m4(mat);
|
||||||
psys_render_set(object, psys, mat, mat, 1, 1, 0);
|
if (use_render_params) {
|
||||||
|
psys_render_set(object, psys, mat, mat, 1, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
sim.scene = scene;
|
sim.scene = scene;
|
||||||
sim.ob = object;
|
sim.ob = object;
|
||||||
@@ -669,11 +710,16 @@ static void particle_system_minmax(Scene *scene,
|
|||||||
psys->lattice_deform_data = NULL;
|
psys->lattice_deform_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
psys_render_restore(object, psys);
|
if (use_render_params) {
|
||||||
|
psys_render_restore(object, psys);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RE_sample_point_density(Scene *scene, PointDensity *pd,
|
void RE_sample_point_density(Scene *scene,
|
||||||
int resolution, float *values)
|
PointDensity *pd,
|
||||||
|
const int resolution,
|
||||||
|
const bool use_render_params,
|
||||||
|
float *values)
|
||||||
{
|
{
|
||||||
const size_t resolution2 = resolution * resolution;
|
const size_t resolution2 = resolution * resolution;
|
||||||
Object *object = pd->object;
|
Object *object = pd->object;
|
||||||
@@ -696,7 +742,12 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd,
|
|||||||
sample_dummy_point_density(resolution, values);
|
sample_dummy_point_density(resolution, values);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
particle_system_minmax(scene, object, psys, pd->radius, min, max);
|
particle_system_minmax(scene,
|
||||||
|
object,
|
||||||
|
psys,
|
||||||
|
pd->radius,
|
||||||
|
use_render_params,
|
||||||
|
min, max);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float radius[3] = {pd->radius, pd->radius, pd->radius};
|
float radius[3] = {pd->radius, pd->radius, pd->radius};
|
||||||
@@ -719,7 +770,7 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd,
|
|||||||
unit_m4(mat);
|
unit_m4(mat);
|
||||||
|
|
||||||
BLI_mutex_lock(&sample_mutex);
|
BLI_mutex_lock(&sample_mutex);
|
||||||
cache_pointdensity_ex(scene, pd, mat, mat, 1, 1);
|
cache_pointdensity_ex(scene, pd, mat, mat, 1, 1, use_render_params);
|
||||||
for (z = 0; z < resolution; ++z) {
|
for (z = 0; z < resolution; ++z) {
|
||||||
for (y = 0; y < resolution; ++y) {
|
for (y = 0; y < resolution; ++y) {
|
||||||
for (x = 0; x < resolution; ++x) {
|
for (x = 0; x < resolution; ++x) {
|
||||||
|
Reference in New Issue
Block a user