Commit: bd503353bb0fd848864ebc4d711b6ccf5e04f2a5
Author: Lukas Tönne
Date:   Sat Apr 4 14:23:14 2015 +0200
Branches: cycles_point_density
https://developer.blender.org/rBbd503353bb0fd848864ebc4d711b6ccf5e04f2a5

Support for particle texture color in point density textures.

This works for all pointdensity use cases, BI as well as Cycles.

===================================================================

M       source/blender/makesdna/DNA_node_types.h
M       source/blender/makesdna/DNA_texture_types.h
M       source/blender/makesrna/intern/rna_nodetree.c
M       source/blender/makesrna/intern/rna_texture.c
M       source/blender/render/intern/source/pointdensity.c

===================================================================

diff --git a/source/blender/makesdna/DNA_node_types.h 
b/source/blender/makesdna/DNA_node_types.h
index 911c6ed..52ce7a2 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1118,6 +1118,7 @@ enum {
        SHD_POINTDENSITY_COLOR_PARTAGE      = 1,
        SHD_POINTDENSITY_COLOR_PARTSPEED    = 2,
        SHD_POINTDENSITY_COLOR_PARTVEL      = 3,
+       SHD_POINTDENSITY_COLOR_PARTTEX      = 4,
 };
 
 #endif
diff --git a/source/blender/makesdna/DNA_texture_types.h 
b/source/blender/makesdna/DNA_texture_types.h
index 523d444..63a0892 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -595,9 +595,11 @@ enum {
 #define TEX_PD_COLOR_PARTAGE   1
 #define TEX_PD_COLOR_PARTSPEED 2
 #define TEX_PD_COLOR_PARTVEL   3
+#define TEX_PD_COLOR_PARTTEX   4
 
 #define POINT_DATA_VEL         1
 #define POINT_DATA_LIFE                2
+#define POINT_DATA_COLOR       3
 
 /******************** Voxel Data *****************************/
 /* flag */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c 
b/source/blender/makesrna/intern/rna_nodetree.c
index c3b9280..8b16173 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -2940,6 +2940,7 @@ static int 
point_density_color_source_from_shader(NodeShaderTexPointDensity *sha
                case SHD_POINTDENSITY_COLOR_PARTAGE: return 
TEX_PD_COLOR_PARTAGE;
                case SHD_POINTDENSITY_COLOR_PARTSPEED: return 
TEX_PD_COLOR_PARTSPEED;
                case SHD_POINTDENSITY_COLOR_PARTVEL: return 
TEX_PD_COLOR_PARTVEL;
+               case SHD_POINTDENSITY_COLOR_PARTTEX: return 
TEX_PD_COLOR_PARTTEX;
                default: BLI_assert(false); return TEX_PD_COLOR_CONSTANT;
        }
 }
@@ -3837,6 +3838,7 @@ static void def_sh_tex_pointdensity(StructRNA *srna)
                                                   "Particle speed (absolute 
magnitude of velocity) mapped as 0.0-1.0 intensity"},
                {SHD_POINTDENSITY_COLOR_PARTVEL, "PARTICLE_VELOCITY", 0, 
"Particle Velocity",
                                                 "XYZ velocity mapped to RGB 
colors"},
+               {SHD_POINTDENSITY_COLOR_PARTTEX, "PARTICLE_TEXTURE", 0, 
"Particle Texture", "Texture color of particles"},
                {0, NULL, 0, NULL, NULL}
        };
 
diff --git a/source/blender/makesrna/intern/rna_texture.c 
b/source/blender/makesrna/intern/rna_texture.c
index 7267447..88f1641 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -1674,6 +1674,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
                {TEX_PD_COLOR_PARTSPEED, "PARTICLE_SPEED", 0, "Particle Speed",
                                         "Particle speed (absolute magnitude of 
velocity) mapped as 0.0-1.0 intensity"},
                {TEX_PD_COLOR_PARTVEL, "PARTICLE_VELOCITY", 0, "Particle 
Velocity", "XYZ velocity mapped to RGB colors"},
+               {TEX_PD_COLOR_PARTTEX, "PARTICLE_TEXTURE", 0, "Particle 
Texture", "Texture color of particles"},
                {0, NULL, 0, NULL, NULL}
        };
        
diff --git a/source/blender/render/intern/source/pointdensity.c 
b/source/blender/render/intern/source/pointdensity.c
index 881de39..c540cee 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -86,6 +86,10 @@ static int point_data_used(PointDensity *pd)
                {
                        pd_bitflag |= POINT_DATA_LIFE;
                }
+               if ((pd->color_source == TEX_PD_COLOR_PARTTEX))
+               {
+                       pd_bitflag |= POINT_DATA_COLOR;
+               }
        }
 
        return pd_bitflag;
@@ -107,6 +111,10 @@ static void alloc_point_data(PointDensity *pd, int 
total_particles, int point_da
                /* store 1 channel of lifetime data */
                data_size += 1;
        }
+       if (point_data_used & POINT_DATA_COLOR) {
+               /* store 3 channels of color data */
+               data_size += 3;
+       }
 
        if (data_size) {
                pd->point_data = MEM_mallocN(sizeof(float) * data_size * 
total_particles,
@@ -114,6 +122,19 @@ static void alloc_point_data(PointDensity *pd, int 
total_particles, int point_da
        }
 }
 
+/* offset of age and color data in the common point data array */
+static void point_data_get_offset(int total_particles, int point_data_used, 
int *offset_life, int *offset_color)
+{
+       *offset_life = *offset_color = 0;
+       if (point_data_used & POINT_DATA_VEL) {
+               *offset_life += total_particles * 3;
+               *offset_color += total_particles * 3;
+       }
+       if (point_data_used & POINT_DATA_LIFE) {
+               *offset_color += total_particles;
+       }
+}
+
 static void pointdensity_cache_psys(Scene *scene,
                                     PointDensity *pd,
                                     Object *ob,
@@ -129,7 +150,7 @@ static void pointdensity_cache_psys(Scene *scene,
        ParticleData *pa = NULL;
        float cfra = BKE_scene_frame_get(scene);
        int i /*, childexists*/ /* UNUSED */;
-       int total_particles, offset = 0;
+       int total_particles, offset_life = 0, offset_color = 0;
        int data_used = point_data_used(pd);
        float partco[3];
 
@@ -161,9 +182,7 @@ static void pointdensity_cache_psys(Scene *scene,
        pd->point_tree = BLI_bvhtree_new(total_particles, 0.0, 4, 6);
        alloc_point_data(pd, total_particles, data_used);
        pd->totpoints = total_particles;
-       if (data_used & POINT_DATA_VEL) {
-               offset = pd->totpoints * 3;
-       }
+       point_data_get_offset(total_particles, data_used, &offset_life, 
&offset_color);
 
 #if 0 /* UNUSED */
        if (psys->totchild > 0 && !(psys->part->draw & PART_DRAW_PARENT))
@@ -226,7 +245,12 @@ static void pointdensity_cache_psys(Scene *scene,
                        pd->point_data[i * 3 + 2] = state.vel[2];
                }
                if (data_used & POINT_DATA_LIFE) {
-                       pd->point_data[offset + i] = state.time;
+                       pd->point_data[offset_life + i] = state.time;
+               }
+               if (data_used & POINT_DATA_COLOR) {
+                       ParticleTexture ptex;
+                       psys_get_texture(&sim, pa, &ptex, PAMAP_COLOR, cfra);
+                       copy_v3_v3(&pd->point_data[offset_color + i * 3], 
ptex.color);
                }
        }
 
@@ -388,8 +412,9 @@ typedef struct PointDensityRangeData {
        short falloff_type;
        short noise_influence;
        float *age;
+       float *col;
        int point_data_used;
-       int offset;
+       int offset_life, offset_color;
        struct CurveMapping *density_curve;
        float velscale;
 } PointDensityRangeData;
@@ -406,7 +431,10 @@ static void accum_density(void *userdata, int index, float 
squared_dist)
                pdr->vec[2] += pdr->point_data[index * 3 + 2]; // * density;
        }
        if (pdr->point_data_used & POINT_DATA_LIFE) {
-               *pdr->age += pdr->point_data[pdr->offset + index]; // * density;
+               *pdr->age += pdr->point_data[pdr->offset_life + index]; // * 
density;
+       }
+       if (pdr->point_data_used & POINT_DATA_COLOR) {
+               add_v3_v3(pdr->col, &pdr->point_data[pdr->offset_color + 
index]); // * density;
        }
 
        if (pdr->falloff_type == TEX_PD_FALLOFF_STD)
@@ -421,7 +449,7 @@ static void accum_density(void *userdata, int index, float 
squared_dist)
                density = sqrtf(dist);
        else if (pdr->falloff_type == TEX_PD_FALLOFF_PARTICLE_AGE) {
                if (pdr->point_data_used & POINT_DATA_LIFE)
-                       density = dist * MIN2(pdr->point_data[pdr->offset + 
index], 1.0f);
+                       density = dist * MIN2(pdr->point_data[pdr->offset_life 
+ index], 1.0f);
                else
                        density = dist;
        }
@@ -442,7 +470,7 @@ static void accum_density(void *userdata, int index, float 
squared_dist)
 
 
 static void init_pointdensityrangedata(PointDensity *pd, PointDensityRangeData 
*pdr,
-       float *density, float *vec, float *age, struct CurveMapping 
*density_curve, float velscale)
+       float *density, float *vec, float *age, float *col, struct CurveMapping 
*density_curve, float velscale)
 {
        pdr->squared_radius = pd->radius * pd->radius;
        pdr->density = density;
@@ -450,10 +478,11 @@ static void init_pointdensityrangedata(PointDensity *pd, 
PointDensityRangeData *
        pdr->falloff_type = pd->falloff_type;
        pdr->vec = vec;
        pdr->age = age;
+       pdr->col = col;
        pdr->softness = pd->falloff_softness;
        pdr->noise_influence = pd->noise_influence;
        pdr->point_data_used = point_data_used(pd);
-       pdr->offset = (pdr->point_data_used & POINT_DATA_VEL) ? pd->totpoints * 
3 : 0;
+       point_data_get_offset(pd->totpoints, pdr->point_data_used, 
&pdr->offset_life, &pdr->offset_color);
        pdr->density_curve = density_curve;
        pdr->velscale = velscale;
 }
@@ -468,7 +497,7 @@ static int pointdensity(PointDensity *pd,
        int retval = TEX_INT;
        PointDensityRangeData pdr;
        float density = 0.0f, age = 0.0f, time = 0.0f;
-       float vec[3] = {0.0f, 0.0f, 0.0f}, co[3];
+       float vec[3] = {0.0f, 0.0f, 0.0f}, color[3] = {0.0f, 0.0f, 0.0f}, co[3];
        float turb, noise_fac;
        int num = 0;
 
@@ -477,7 +506,7 @@ static int pointdensity(PointDensity *pd,
        if ((!pd) || (!pd->point_tree))
                return 0;
 
-       init_pointdensityrangedata(pd, &pdr, &density, vec, &age,
+       init_pointdensityrangedata(pd, &pdr, &density, vec, &age, color,
                (pd->flag & TEX_PD_FALLOFF_CURVE ? pd->falloff_curve : NULL),
                pd->falloff_speed_scale * 0.001f);
        noise_fac = pd->noise_fac * 0.5f;       /* better default */
@@ -530,6 +559,9 @@ static int pointdensity(PointDensity *pd,
        }
 
        texres->tin = density;
+       texres->tr = color[0];
+       texres->tg = color[1];
+       texres->tb = color[2];
        if (r_age != NULL) {
                *r_age = age;
        }
@@ -577,6 +609,11 @@ static int pointdensity_color(PointDensity *pd, TexResult 
*texres, float age, co
                        mul_v3_v3fl(&texres->tr, vec, pd->speed_scale);
                        texres->ta = texres->tin;
                        break;
+               case TEX_PD_COLOR_PARTTEX:
+                       /* texres already has the particle color */
+                       texres->talpha = true;
+                       texres->ta = texres->tin;
+                       break;
                case TEX_PD_COLOR_CONSTANT:
                default:
                        texres->tr = texres->tg = texres->tb = texres->ta = 
1.0f;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to