[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11205] branches/soc-2007-mosani/source/ blender/render/render_api: I' ve just implemented inclusion of duplicated objects in

Aaron Moore two.a.ron at gmail.com
Tue Jul 10 10:45:48 CEST 2007


Revision: 11205
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11205
Author:   mosani
Date:     2007-07-10 10:45:47 +0200 (Tue, 10 Jul 2007)

Log Message:
-----------
I've just implemented inclusion of duplicated objects in
the objects index and exclusion of the duplicators.

I somewhat crude test is in place:
 - create any duplicator geometry you wish.
 - toggle Render API on and press render
 - change the scene to "render api scene 1"

The new scene will have only the geometry included in the form
it will be seen as through the render API.

Modified Paths:
--------------
    branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI.h
    branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h
    branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c
    branches/soc-2007-mosani/source/blender/render/render_api/source/test.c

Modified: branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI.h
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI.h	2007-07-10 02:33:00 UTC (rev 11204)
+++ branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI.h	2007-07-10 08:45:47 UTC (rev 11205)
@@ -61,7 +61,8 @@
 #include "DNA_meshdata_types.h"
 #include "BKE_DerivedMesh.h"
 #include "DNA_curve_types.h"
-#include "DNA_ipo_types.h"
+#include "DNA_ipo_types.h"
+#include "BKE_anim.h"
 
 /****************************************************************************/
 /********************************   Types   *********************************/

Modified: branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h	2007-07-10 02:33:00 UTC (rev 11204)
+++ branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h	2007-07-10 08:45:47 UTC (rev 11205)
@@ -48,6 +48,10 @@
 
 void RenderAPI_empty_list( ListBase *list );
 
+
+/* OBJECT INDEXING FUNCTIONS: */
+
+
 /* scan scene->source, fill object holder lists with all objects that will
  * participate in this render job. Simultaneously, index by type and instance
  * status */
@@ -57,8 +61,11 @@
 int RenderAPI_is_rendered( Base *base );
 
 /* creates a pointer to holder and pushes it on the end of index */
-void RenderAPI_index_type( RenderAPIObjectHolder *holder, ListBase *index );
+void RenderAPI_add_to_index( RenderAPIObjectHolder *holder, ListBase *index );
 
+/* sets the type of holder and assings it to the correct type index.  */
+void RenderAPI_index_by_type( RenderAPIObjectHolder *holder, RNDScene scene );
+
 /* runs index_type on holder where it's Lamp->type is type, and the scene
  * contains the indexes for pushing lights */
 void RenderAPI_index_light( RenderAPIObjectHolder *holder, short type,
@@ -76,5 +83,15 @@
  * and returns it */
 RenderAPIObjectPointer* RenderAPI_copy_object_pointer( 
 	RenderAPIObjectPointer* original );
+
+
+
+/* DUPLICATOR FUNCTIONS: */
+
+
+
+void RenderAPI_collapse_duplicator( Object *duplicator, RNDScene scene );
+
+int RenderAPI_dupligeometry_decendent( Object *candidate );
 
 #endif

Modified: branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c	2007-07-10 02:33:00 UTC (rev 11204)
+++ branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c	2007-07-10 08:45:47 UTC (rev 11205)
@@ -97,52 +97,43 @@
 	list->first = list->last = NULL;
 }
 
+
+
+
+
+
+/* 
+ *   OBJECT INDEXING FUNCTIONS:
+ */
+
+
+
+
+
+
+
+
+
+
 void RenderAPI_create_object_indexes( RNDScene scene )
 {
 	RenderAPIObjectHolder *holder;
-
 	/* loop through scene, gather objects which will participate */
 	Base *current_base = scene->source->base.first;
 	for( ; current_base; current_base = current_base->next )
 	{
 		if( RenderAPI_is_rendered( current_base ) )
 		{
-			/* index the type while adding to the scene */
-			switch( current_base->object->type ){
-			case OB_LAMP:
-				holder = RenderAPI_create_object_holder( current_base->object );
-				BLI_addtail( &scene->objects, holder );
-				RenderAPI_index_light( holder, 
-					((Lamp*)current_base->object->data)->type , scene );
-				break;
-			case OB_MESH:
-				holder = RenderAPI_create_object_holder( current_base->object );
-				BLI_addtail( &scene->objects, holder );
-				/* check for particals / subdivision surfaces */
-				holder->type |= RND_GEOMETRY_POLYGON_MESH;
-				RenderAPI_index_type( holder, &scene->geometry_polygon_mesh );
-				break;
-			case OB_SURF:
-				holder = RenderAPI_create_object_holder( current_base->object );
-				BLI_addtail( &scene->objects, holder );
-				holder->type |= RND_GEOMETRY_NURB_SURFACE;
-				RenderAPI_index_type( holder, &scene->geometry_nurb_surface );
-				break;
-			case OB_CURVE:
-			case OB_FONT:
-				holder = RenderAPI_create_object_holder( current_base->object );
-				BLI_addtail( &scene->objects, holder );
-				holder->type |= RND_GEOMETRY_CURVE;
-				RenderAPI_index_type( holder, &scene->geometry_curve );
-				break;
-			case OB_MBALL:
-				holder = RenderAPI_create_object_holder( current_base->object );
-				BLI_addtail( &scene->objects, holder );
-				holder->type |= RND_GEOMETRY_METABALL;
-				RenderAPI_index_type( holder, &scene->geometry_metaball );
-				break;
-			default: break;
+			if( current_base->object->transflag & OB_DUPLI )
+			{
+				RenderAPI_collapse_duplicator( current_base->object, scene );
+				continue;
 			}
+			if( RenderAPI_dupligeometry_decendent( current_base->object ) )
+				continue;
+			holder = RenderAPI_create_object_holder( current_base->object );
+			BLI_addtail( &scene->objects, holder );
+			RenderAPI_index_by_type( holder, scene );
 		}
 	}
 	
@@ -169,7 +160,7 @@
 	return 1;
 }
 
-void RenderAPI_index_type( RenderAPIObjectHolder *holder, ListBase *index )
+void RenderAPI_add_to_index( RenderAPIObjectHolder *holder, ListBase *index )
 {
 	RenderAPIObjectPointer *ptr = MEM_mallocN( sizeof(RenderAPIObjectPointer),
 		"renderAPI object pointer" );
@@ -177,25 +168,55 @@
 	BLI_addtail( index, ptr );
 }
 
+void RenderAPI_index_by_type( RenderAPIObjectHolder *holder, RNDScene scene )
+{
+	/* index the type while adding to the scene */
+	switch( holder->source->type ){
+	case OB_LAMP:
+		RenderAPI_index_light( holder, 
+			((Lamp*)holder->source->data)->type , scene );
+		break;
+	case OB_MESH:
+		/* check for particals / subdivision surfaces */
+		holder->type |= RND_GEOMETRY_POLYGON_MESH;
+		RenderAPI_add_to_index( holder, &scene->geometry_polygon_mesh );
+		break;
+	case OB_SURF:
+		holder->type |= RND_GEOMETRY_NURB_SURFACE;
+		RenderAPI_add_to_index( holder, &scene->geometry_nurb_surface );
+		break;
+	case OB_CURVE:
+	case OB_FONT:
+		holder->type |= RND_GEOMETRY_CURVE;
+		RenderAPI_add_to_index( holder, &scene->geometry_curve );
+		break;
+	case OB_MBALL:
+		holder->type |= RND_GEOMETRY_METABALL;
+		RenderAPI_add_to_index( holder, &scene->geometry_metaball );
+		break;
+	default: break;
+	}
+}
+
 void RenderAPI_index_light( RenderAPIObjectHolder *holder, short type,
 	RNDScene scene )
 {
 	switch(type){
 	case LA_LOCAL:
 		holder->type |= RND_LIGHT_POINT;
-		RenderAPI_index_type( holder, &scene->light_point ); break;
+		RenderAPI_add_to_index( holder, &scene->light_point ); break;
 	case LA_SUN:
 		holder->type |= RND_LIGHT_SUN;
-		RenderAPI_index_type( holder, &scene->light_sun ); break;
+		RenderAPI_add_to_index( holder, &scene->light_sun ); break;
 	case LA_SPOT:
 		holder->type |= RND_LIGHT_SPOT;
-		RenderAPI_index_type( holder, &scene->light_spot ); break;
+		RenderAPI_add_to_index( holder, &scene->light_spot ); break;
 	case LA_HEMI:
 		holder->type |= RND_LIGHT_HEMI;
-		RenderAPI_index_type( holder, &scene->light_hemi ); break;
+		RenderAPI_add_to_index( holder, &scene->light_hemi ); break;
 	case LA_AREA:
 		holder->type |= RND_LIGHT_AREA;
-		RenderAPI_index_type( holder, &scene->light_area ); break;
+		RenderAPI_add_to_index( holder, &scene->light_area ); break;
 	case LA_YF_PHOTON:
 		break;
 	}
@@ -252,3 +273,50 @@
 }
 
 
+
+
+
+
+
+/* 
+ *   DUPLICATOR FUNCTIONS:
+ */
+
+
+
+
+
+
+
+
+void RenderAPI_collapse_duplicator( Object *duplicator, RNDScene scene )
+{
+	int i;
+	DupliObject *duplicate;
+	RenderAPIObjectHolder *holder;
+	ListBase *duplilist = object_duplilist( scene->source, duplicator );
+	for( duplicate = duplilist->first, i = 0; 
+			duplicate; 
+			duplicate = duplicate->next, i++ )
+	{
+		holder = RenderAPI_create_object_holder( duplicate->ob );
+		Mat4CpyMat4( holder->transformation, duplicate->mat );
+		sprintf( holder->name, "%s_dup%d", holder->name, i );
+		BLI_addtail( &scene->objects, holder );
+		RenderAPI_index_by_type( holder, scene ); 
+	}
+	free_object_duplilist( duplilist );
+}
+
+int RenderAPI_dupligeometry_decendent( Object *candidate )
+{
+	/* if any of the parents are dupliverts or frames, return true */
+	candidate = candidate->parent;
+	for( ; candidate; candidate = candidate->parent )
+		if( candidate->transflag & OB_DUPLIVERTS ||
+			candidate->transflag & OB_DUPLIFACES )
+			return 1;
+	return 0;
+}
+
+

Modified: branches/soc-2007-mosani/source/blender/render/render_api/source/test.c
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/source/test.c	2007-07-10 02:33:00 UTC (rev 11204)
+++ branches/soc-2007-mosani/source/blender/render/render_api/source/test.c	2007-07-10 08:45:47 UTC (rev 11205)
@@ -1,4 +1,3 @@
-
 /* test.c - Aaron Moore, July 2007
  *    Desc: for testing purposes. Eventually this code will be 
  *     part of either the render pipeline or the render callbacks.
@@ -11,14 +10,30 @@
 /* currently it can be accessed by toggling on render api and hitting render */
 void RenderAPI_test(){
 	RNDObject object;
+	char name[30];
+	static int i = 0;
+	static Scene *new_scene = NULL;
 	RNDScene scene = RenderAPI_create_scene( G.scene );
 	RenderAPI_create_object_indexes( scene );
 	
-	object = RND_get_instanced_objects( scene, RND_GEOMETRY );
-	fprintf( stderr, "objects:\n" );
+	i++;
+	sprintf( name, "render api scene %d", i );
+	new_scene = add_scene( name );
+	object = RND_get_objects( scene, RND_GEOMETRY );
 	for( ; RND_object_exists( object ); RND_object_next( object ) )
-		fprintf( stderr, "%s, instance=%d\n", 
-			RND_object_get_name( object ), RND_object_is_instance( object ) );
+	{
+		Object *new_object = MEM_mallocN( sizeof(Object), 
+			"object for render API test" );
+		memcpy( new_object, object->current->holder->source, sizeof(Object) );
+		strcpy( new_object->id.name, object->current->holder->name );
+		Mat4CpyMat4( new_object->obmat, object->current->holder->transformation );
+		VecCopyf( new_object->loc, object->current->holder->transformation[3] );
+		new_object->parent = NULL;
+		new_object->transflag &= ~OB_DUPLIFRAMES;
+		new_object->ipo = NULL;
+		new_object->flag &= ~OB_FROMGROUP;
+		scene_add_base( new_scene, new_object );
+	}
 	
 	RenderAPI_free_scene( scene );
 }





More information about the Bf-blender-cvs mailing list