[Bf-blender-cvs] [e95a213] blender-v2.76-release: Fix T46333: Particle Info Node broken w/ BI

Campbell Barton noreply at git.blender.org
Fri Oct 9 13:32:50 CEST 2015


Commit: e95a213f7ab14cf5109dabe8d06ac572e3d9112a
Author: Campbell Barton
Date:   Mon Oct 5 23:23:05 2015 +1100
Branches: blender-v2.76-release
https://developer.blender.org/rBe95a213f7ab14cf5109dabe8d06ac572e3d9112a

Fix T46333: Particle Info Node broken w/ BI

Patch from @a.romanov

This also fixes multiple particle systems - which never worked.

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

M	source/blender/render/intern/include/renderdatabase.h
M	source/blender/render/intern/source/convertblender.c
M	source/blender/render/intern/source/renderdatabase.c

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

diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index da45a2b..2249744 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -115,7 +115,9 @@ struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, s
 struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
 
 struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
-struct ObjectInstanceRen *RE_addRenderInstance(struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, int index, int psysindex, float mat[4][4], int lay);
+struct ObjectInstanceRen *RE_addRenderInstance(
+        struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par,
+        int index, int psysindex, float mat[4][4], int lay, const struct DupliObject *dob);
 void RE_makeRenderInstances(struct Render *re);
 
 void RE_instance_rotate_ray_start(struct ObjectInstanceRen *obi, struct Isect *is);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index ee28c3b..0adcc16 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4658,7 +4658,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
 
 		/* only add instance for objects that have not been used for dupli */
 		if (!(ob->transflag & OB_RENDER_DUPLI)) {
-			obi= RE_addRenderInstance(re, obr, ob, par, index, 0, NULL, ob->lay);
+			obi = RE_addRenderInstance(re, obr, ob, par, index, 0, NULL, ob->lay, dob);
 			if (dob) set_dupli_tex_mat(re, obi, dob, omat);
 		}
 		else
@@ -4692,7 +4692,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
 
 			/* only add instance for objects that have not been used for dupli */
 			if (!(ob->transflag & OB_RENDER_DUPLI)) {
-				obi= RE_addRenderInstance(re, obr, ob, par, index, psysindex, NULL, ob->lay);
+				obi = RE_addRenderInstance(re, obr, ob, par, index, psysindex, NULL, ob->lay, dob);
 				if (dob) set_dupli_tex_mat(re, obi, dob, omat);
 			}
 			else
@@ -5053,7 +5053,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
 						if (dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, 0))) {
 							mul_m4_m4m4(mat, re->viewmat, dob->mat);
 														/* ob = particle system, use that layer */
-							obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], 0, mat, ob->lay); 
+							obi = RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], 0, mat, ob->lay, dob);
 
 							/* fill in instance variables for texturing */
 							set_dupli_tex_mat(re, obi, dob, dob_extra->obmat);
@@ -5080,7 +5080,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
 							if (dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, psysindex))) {
 								if (obi == NULL)
 									mul_m4_m4m4(mat, re->viewmat, dob->mat);
-								obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], psysindex++, mat, obd->lay);
+								obi = RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], psysindex++, mat, obd->lay, dob);
 
 								set_dupli_tex_mat(re, obi, dob, dob_extra->obmat);
 								if (dob->type != OB_DUPLIGROUP) {
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 7a9b2d0..5f78c8a 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -1363,7 +1363,9 @@ void project_renderdata(Render *re,
 
 /* ------------------------------------------------------------------------- */
 
-ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, Object *par, int index, int psysindex, float mat[4][4], int lay)
+ObjectInstanceRen *RE_addRenderInstance(
+        Render *re, ObjectRen *obr, Object *ob, Object *par,
+        int index, int psysindex, float mat[4][4], int lay, const DupliObject *dob)
 {
 	ObjectInstanceRen *obi;
 	float mat3[3][3];
@@ -1377,33 +1379,30 @@ ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob,
 	obi->lay= lay;
 
 	/* Fill particle info */
-	if (obi->psysindex > 0) {
-		int psysindex = 1;
-		int index;
-		ParticleSystem *psys;
-		if (obi->par) {
-			for (psys = obi->par->particlesystem.first; psys; psys = psys->next) {
-				if (psysindex == obi->psysindex)
-					break;
-				++psysindex;
+	if (par && dob) {
+		const ParticleSystem *psys = dob->particle_system;
+		if (psys) {
+			int index;
+			if (obi->index < psys->totpart) {
+				index = obi->index;
 			}
-			if (psys) {
-				if (obi->index < psys->totpart)
-					index = obi->index;
-				else {
-					index = psys->child[obi->index - psys->totpart].parent;
-				}
-				if (index >= 0) {
-					ParticleData* p = &psys->particles[index];
-					obi->part_index = index;
-					obi->part_size = p->size;
-					obi->part_age = RE_GetStats(re)->cfra - p->time;
-					obi->part_lifetime = p->lifetime;
-
-					copy_v3_v3(obi->part_co, p->state.co);
-					copy_v3_v3(obi->part_vel, p->state.vel);
-					copy_v3_v3(obi->part_avel, p->state.ave);
-				}
+			else if (psys->child) {
+				index = psys->child[obi->index - psys->totpart].parent;
+			}
+			else {
+				index = -1;
+			}
+
+			if (index >= 0) {
+				const ParticleData *p = &psys->particles[index];
+				obi->part_index = index;
+				obi->part_size = p->size;
+				obi->part_age = RE_GetStats(re)->cfra - p->time;
+				obi->part_lifetime = p->lifetime;
+
+				copy_v3_v3(obi->part_co, p->state.co);
+				copy_v3_v3(obi->part_vel, p->state.vel);
+				copy_v3_v3(obi->part_avel, p->state.ave);
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list