[Bf-blender-cvs] [b5fe00d1ac4] master: Cycles: restore Particle Info Index for now, keep it next to Random.

Brecht Van Lommel noreply at git.blender.org
Wed Feb 14 21:49:23 CET 2018


Commit: b5fe00d1ac43c16ec8f74d3ad7689599dfb2ef00
Author: Brecht Van Lommel
Date:   Wed Feb 14 17:02:28 2018 +0100
Branches: master
https://developer.blender.org/rBb5fe00d1ac43c16ec8f74d3ad7689599dfb2ef00

Cycles: restore Particle Info Index for now, keep it next to Random.

It seems to be useful still in cases where the particle are distributed in
a particular order or pattern, to colorize them along with that. This isn't
really well defined, but might as well avoid breaking backwards compatibility
for now.

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

M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/kernel/osl/osl_services.h
M	intern/cycles/kernel/shaders/node_particle_info.osl
M	intern/cycles/kernel/svm/svm_geometry.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/particles.cpp
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_particle_info.c
M	source/blender/render/extern/include/RE_shader_ext.h
M	source/blender/render/intern/source/renderdatabase.c

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

diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index a63d180d450..32aa2007f5d 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -352,11 +352,11 @@ ccl_device int shader_pass_id(KernelGlobals *kg, const ShaderData *sd)
 
 /* Particle data from which object was instanced */
 
-ccl_device_inline float particle_random(KernelGlobals *kg, int particle)
+ccl_device_inline uint particle_index(KernelGlobals *kg, int particle)
 {
 	int offset = particle*PARTICLE_SIZE;
 	float4 f = kernel_tex_fetch(__particles, offset + 0);
-	return f.x;
+	return __float_as_uint(f.x);
 }
 
 ccl_device float particle_age(KernelGlobals *kg, int particle)
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index c4128e84f5c..ae4c521659c 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -82,6 +82,7 @@ ustring OSLRenderServices::u_geom_dupli_generated("geom:dupli_generated");
 ustring OSLRenderServices::u_geom_dupli_uv("geom:dupli_uv");
 ustring OSLRenderServices::u_material_index("material:index");
 ustring OSLRenderServices::u_object_random("object:random");
+ustring OSLRenderServices::u_particle_index("particle:index");
 ustring OSLRenderServices::u_particle_random("particle:random");
 ustring OSLRenderServices::u_particle_age("particle:age");
 ustring OSLRenderServices::u_particle_lifetime("particle:lifetime");
@@ -652,11 +653,17 @@ bool OSLRenderServices::get_object_standard_attribute(KernelGlobals *kg, ShaderD
 	}
 
 	/* Particle Attributes */
+	else if(name == u_particle_index) {
+		int particle_id = object_particle_id(kg, sd->object);
+		float f = particle_index(kg, particle_id);
+		return set_attribute_float(f, type, derivatives, val);
+	}
 	else if(name == u_particle_random) {
 		int particle_id = object_particle_id(kg, sd->object);
-		float f = particle_random(kg, particle_id);
+		float f = hash_int_01(particle_index(kg, particle_id));
 		return set_attribute_float(f, type, derivatives, val);
 	}
+
 	else if(name == u_particle_age) {
 		int particle_id = object_particle_id(kg, sd->object);
 		float f = particle_age(kg, particle_id);
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
index 2f2dc124a98..d96048e26f2 100644
--- a/intern/cycles/kernel/osl/osl_services.h
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -146,6 +146,7 @@ public:
 	static ustring u_geom_dupli_uv;
 	static ustring u_material_index;
 	static ustring u_object_random;
+	static ustring u_particle_index;
 	static ustring u_particle_random;
 	static ustring u_particle_age;
 	static ustring u_particle_lifetime;
diff --git a/intern/cycles/kernel/shaders/node_particle_info.osl b/intern/cycles/kernel/shaders/node_particle_info.osl
index 05358400bf8..2a0252d5e45 100644
--- a/intern/cycles/kernel/shaders/node_particle_info.osl
+++ b/intern/cycles/kernel/shaders/node_particle_info.osl
@@ -17,6 +17,7 @@
 #include "stdosl.h"
 
 shader node_particle_info(
+    output float Index = 0.0,
     output float Random = 0.0,
     output float Age = 0.0,
     output float Lifetime = 0.0,
@@ -25,6 +26,7 @@ shader node_particle_info(
     output vector Velocity = point(0.0, 0.0, 0.0),
     output vector AngularVelocity = point(0.0, 0.0, 0.0))
 {
+	getattribute("particle:index", Index);
 	getattribute("particle:random", Random);
 	getattribute("particle:age", Age);
 	getattribute("particle:lifetime", Lifetime);
diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h
index 2f85a801112..81308d6f12b 100644
--- a/intern/cycles/kernel/svm/svm_geometry.h
+++ b/intern/cycles/kernel/svm/svm_geometry.h
@@ -114,9 +114,15 @@ ccl_device void svm_node_particle_info(KernelGlobals *kg,
                                        uint out_offset)
 {
 	switch(type) {
+		case NODE_INFO_PAR_INDEX: {
+			int particle_id = object_particle_id(kg, sd->object);
+			stack_store_float(stack, out_offset, particle_index(kg, particle_id));
+			break;
+		}
 		case NODE_INFO_PAR_RANDOM: {
 			int particle_id = object_particle_id(kg, sd->object);
-			stack_store_float(stack, out_offset, particle_random(kg, particle_id));
+			float random = hash_int_01(particle_index(kg, particle_id));
+			stack_store_float(stack, out_offset, random);
 			break;
 		}
 		case NODE_INFO_PAR_AGE: {
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 9e19ab4444d..390d3255684 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -160,6 +160,7 @@ typedef enum NodeObjectInfo {
 } NodeObjectInfo;
 
 typedef enum NodeParticleInfo {
+	NODE_INFO_PAR_INDEX,
 	NODE_INFO_PAR_RANDOM,
 	NODE_INFO_PAR_AGE,
 	NODE_INFO_PAR_LIFETIME,
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 44c807065e4..48613a9324c 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -3463,6 +3463,7 @@ NODE_DEFINE(ParticleInfoNode)
 {
 	NodeType* type = NodeType::add("particle_info", create, NodeType::SHADER);
 
+	SOCKET_OUT_FLOAT(random, "Index");
 	SOCKET_OUT_FLOAT(random, "Random");
 	SOCKET_OUT_FLOAT(age, "Age");
 	SOCKET_OUT_FLOAT(lifetime, "Lifetime");
@@ -3484,6 +3485,8 @@ ParticleInfoNode::ParticleInfoNode()
 
 void ParticleInfoNode::attributes(Shader *shader, AttributeRequestSet *attributes)
 {
+	if(!output("Index")->links.empty())
+		attributes->add(ATTR_STD_PARTICLE);
 	if(!output("Random")->links.empty())
 		attributes->add(ATTR_STD_PARTICLE);
 	if(!output("Age")->links.empty())
@@ -3510,6 +3513,11 @@ void ParticleInfoNode::compile(SVMCompiler& compiler)
 {
 	ShaderOutput *out;
 	
+	out = output("Index");
+	if(!out->links.empty()) {
+		compiler.add_node(NODE_PARTICLE_INFO, NODE_INFO_PAR_INDEX, compiler.stack_assign(out));
+	}
+
 	out = output("Random");
 	if(!out->links.empty()) {
 		compiler.add_node(NODE_PARTICLE_INFO, NODE_INFO_PAR_RANDOM, compiler.stack_assign(out));
diff --git a/intern/cycles/render/particles.cpp b/intern/cycles/render/particles.cpp
index 07e246a092a..3ee620c9d01 100644
--- a/intern/cycles/render/particles.cpp
+++ b/intern/cycles/render/particles.cpp
@@ -80,8 +80,7 @@ void ParticleSystemManager::device_update_particles(Device *, DeviceScene *dscen
 			Particle& pa = psys->particles[k];
 			int offset = i*PARTICLE_SIZE;
 			
-			float random = hash_int_01(pa.index);
-			particles[offset] = make_float4(random, pa.age, pa.lifetime, pa.size);
+			particles[offset] = make_float4(__uint_as_float(pa.index), pa.age, pa.lifetime, pa.size);
 			particles[offset+1] = pa.rotation;
 			particles[offset+2] = make_float4(pa.location.x, pa.location.y, pa.location.z, pa.velocity.x);
 			particles[offset+3] = make_float4(pa.velocity.y, pa.velocity.z, pa.angular_velocity.x, pa.angular_velocity.y);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index dbfcd4d1ea4..e229afd3323 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -344,10 +344,9 @@ void GPU_zenith_update_color(float color[3]);
 struct GPUParticleInfo
 {
 	float scalprops[4];
-	float location[3];
+	float location[4];
 	float velocity[3];
 	float angular_velocity[3];
-	int random_id;
 };
 
 #ifdef WITH_OPENSUBDIV
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index d7e744951c4..61d57dee092 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -1884,12 +1884,14 @@ static int gpu_get_particle_info(GPUParticleInfo *pi)
 		if (ind >= 0) {
 			ParticleData *p = &dob->particle_system->particles[ind];
 
-			pi->scalprops[0] = BLI_hash_int_01(ind);
+			pi->scalprops[0] = ind;
 			pi->scalprops[1] = GMS.gscene->r.cfra - p->time;
 			pi->scalprops[2] = p->lifetime;
 			pi->scalprops[3] = p->size;
 
 			copy_v3_v3(pi->location, p->state.co);
+			pi->location[3] = BLI_hash_int_01(ind);
+
 			copy_v3_v3(pi->velocity, p->state.vel);
 			copy_v3_v3(pi->angular_velocity, p->state.ave);
 			return 1;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 33eac16dadf..edb6c9a29f9 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -452,7 +452,7 @@ void GPU_material_bind_uniforms(
 			GPU_shader_uniform_vector(shader, material->partscalarpropsloc, 4, 1, pi->scalprops);
 		}
 		if (material->builtins & GPU_PARTICLE_LOCATION) {
-			GPU_shader_uniform_vector(shader, material->partcoloc, 3, 1, pi->location);
+			GPU_shader_uniform_vector(shader, material->partcoloc, 4, 1, pi->location);
 		}
 		if (material->builtins & GPU_PARTICLE_VELOCITY) {
 			GPU_shader_uniform_vector(shader, material->partvel, 3, 1, pi->velocity);
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 5fe14e76a90..1f5ffbdcc7e 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -189,16 +189,18 @@ void geom(
 }
 
 void particle_info(
-        vec4 sprops, vec3 loc, vec3 vel, vec3 avel,
-        out float random, out float age, out float life_time, out vec3 location,
+        vec4 sprops, vec4 loc, vec3 vel, vec3 avel,
+        out float index, out float random, out float age,
+        out float life_time, out vec3 location,
         out float size, out vec3 velocity, out vec3 angular_velocity)
 {
-	random = sprops.x;
+	index = sprops.x;
+	random = loc.w;
 	age = sprops.y;
 	life_time = sprops.z;
 	size = sprops.w;
 
-	location = loc;
+	location = loc.xyz;
 	velocity = vel;
 	angular_velocity = avel;
 }
diff --git a/source/blender/nodes/shader/nodes/node_shader_particle_info.c b/source/blender/nodes/shader/nodes/node_shader_particle_info.c
index 721d470b467..3dbe5c81c57 100644
--- a/source/blender/nodes/shader/nodes/node_shader_particle_info.c
+++ b/source/blender/nodes/shader/nodes/node_shader_particle_info.c
@@ -29,6 +29,7 @@
 #include "RE_shader_ext.h"
 
 static bNodeSocketTemplate outputs[] = {
+	{ SOCK_FLOAT,  0, "Index" },
 	{ SOCK_FLOAT,  0, "Random" },
 	{ SOCK_FLOAT

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list