[Bf-blender-cvs] [1abd2f279d] blender2.8: Clay Engine: Small instancing fixes

Clément Foucault noreply at git.blender.org
Sat Feb 11 20:48:03 CET 2017


Commit: 1abd2f279dfe87c2d1d648b9780f25697a9b2c52
Author: Clément Foucault
Date:   Thu Feb 9 20:54:37 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB1abd2f279dfe87c2d1d648b9780f25697a9b2c52

Clay Engine: Small instancing fixes

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

M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 55ef8359e2..0cfe75c311 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -623,6 +623,7 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
 	int offset = 0;
 	DRWInterface *interface = shgroup->interface;
 	int vert_nbr = interface->instance_count;
+	int buffer_size = 0;
 
 	if (vert_nbr == 0) {
 		if (interface->instance_vbo) {
@@ -635,6 +636,7 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
 	/* only once */
 	if (interface->attribs_stride == 0) {
 		for (DRWAttrib *attrib = interface->attribs.first; attrib; attrib = attrib->next, i++) {
+			BLI_assert(attrib->type == DRW_ATTRIB_FLOAT); /* Only float for now */
 			interface->attribs_stride += attrib->size;
 			interface->attribs_size[i] = attrib->size;
 			interface->attribs_loc[i] = attrib->location;
@@ -642,15 +644,13 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
 	}
 
 	/* Gather Data */
-	float *data = MEM_mallocN(sizeof(float) * interface->attribs_stride * vert_nbr , "Instance VBO data");
+	buffer_size = sizeof(float) * interface->attribs_stride * vert_nbr;
+	float *data = MEM_mallocN(buffer_size, "Instance VBO data");
 
-	i = 0;
-	for (DRWDynamicCall *call = shgroup->calls.first; call; call = call->next, i++) {
-		int j = 0;
-		for (DRWAttrib *attrib = interface->attribs.first; attrib; attrib = attrib->next, j++) {
-			BLI_assert(attrib->type == DRW_ATTRIB_FLOAT); /* Only float for now */
-			memcpy(data + offset, call->data[j], sizeof(float) * attrib->size);
-			offset += attrib->size;
+	for (DRWDynamicCall *call = shgroup->calls.first; call; call = call->next) {
+		for (int j = 0; j < interface->attribs_count; ++j) {
+			memcpy(data + offset, call->data[j], sizeof(float) * interface->attribs_size[j]);
+			offset += interface->attribs_size[j];
 		}
 	}
 
@@ -662,7 +662,7 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
 
 	glGenBuffers(1, &interface->instance_vbo);
 	glBindBuffer(GL_ARRAY_BUFFER, interface->instance_vbo);
-	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 4 * 4 * vert_nbr, data, GL_STATIC_DRAW);
+	glBufferData(GL_ARRAY_BUFFER, buffer_size, data, GL_STATIC_DRAW);
 
 	MEM_freeN(data);
 }
@@ -785,10 +785,10 @@ typedef struct DRWBoundTexture {
 	GPUTexture *tex;
 } DRWBoundTexture;
 
-static void draw_geometry(DRWShadingGroup *shgroup, DRWInterface *interface, Batch *geom,
-                          unsigned int instance_vbo, int instance_count, const float (*obmat)[4])
+static void draw_geometry(DRWShadingGroup *shgroup, Batch *geom, const float (*obmat)[4])
 {
 	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	DRWInterface *interface = shgroup->interface;
 	
 	float mvp[4][4], mv[4][4], n[3][3];
 	float eye[3] = { 0.0f, 0.0f, 1.0f }; /* looking into the screen */
@@ -840,8 +840,8 @@ static void draw_geometry(DRWShadingGroup *shgroup, DRWInterface *interface, Bat
 
 	/* step 2 : bind vertex array & draw */
 	Batch_set_program(geom, GPU_shader_get_program(shgroup->shader));
-	if (instance_vbo) {
-		Batch_draw_stupid_instanced(geom, instance_vbo, instance_count, interface->attribs_count,
+	if (interface->instance_vbo) {
+		Batch_draw_stupid_instanced(geom, interface->instance_vbo, interface->instance_count, interface->attribs_count,
 		                            interface->attribs_stride, interface->attribs_size, interface->attribs_loc);
 	}
 	else {
@@ -918,18 +918,18 @@ static void draw_shgroup(DRWShadingGroup *shgroup)
 		unit_m4(obmat);
 
 		if (shgroup->type == DRW_SHG_INSTANCE && interface->instance_count > 0) {
-			draw_geometry(shgroup, interface, shgroup->instance_geom, interface->instance_vbo, interface->instance_count, obmat);
+			draw_geometry(shgroup, shgroup->instance_geom, obmat);
 		}
 		else {
 			/* Some dynamic batch can have no geom (no call to aggregate) */
 			if (shgroup->batch_geom) {
-				draw_geometry(shgroup, interface, shgroup->batch_geom, 0, 1, obmat);
+				draw_geometry(shgroup, shgroup->batch_geom, obmat);
 			}
 		}
 	}
 	else {
 		for (DRWCall *call = shgroup->calls.first; call; call = call->next) {
-			draw_geometry(shgroup, interface, call->geometry, 0, 1, call->obmat);
+			draw_geometry(shgroup, call->geometry, call->obmat);
 		}
 	}
 }




More information about the Bf-blender-cvs mailing list