[Bf-blender-cvs] [efa401b086] clay-engine: Introduce Dynamic Batches + Relationship lines + Clear some matrix warnings

Clément Foucault noreply at git.blender.org
Fri Jan 27 11:19:37 CET 2017


Commit: efa401b086fe558ab100309a727c6d04e7387f10
Author: Clément Foucault
Date:   Fri Jan 27 11:18:16 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBefa401b086fe558ab100309a727c6d04e7387f10

Introduce Dynamic Batches + Relationship lines + Clear some matrix warnings

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

M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_mode_pass.c
M	source/blender/draw/intern/draw_mode_pass.h
M	source/blender/editors/space_view3d/view3d_draw.c

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

diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index ffdad41bef..f741cb54b9 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -534,8 +534,8 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
 				geom = DRW_cache_surface_get(ob);
 
 				/* Add everything for now */
-				DRW_shgroup_call_add(depthbatch, geom, &ob->obmat);
-				DRW_shgroup_call_add(default_shgrp, geom, &ob->obmat);
+				DRW_shgroup_call_add(depthbatch, geom, ob->obmat);
+				DRW_shgroup_call_add(default_shgrp, geom, ob->obmat);
 
 				/* When encountering a new material :
 				 * - Create new Batch
@@ -554,14 +554,10 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
 				break;
 		}
 
-		/* Add all object center for now */
 		DRW_shgroup_object_center(passes->ob_center_pass, ob);
+		DRW_shgroup_relationship_lines(passes->non_meshes_pass, ob);
 	}
 	FOREACH_OBJECT_END
-
-	/* Optimization */
-	// DRWShadingGroup *shgrp = DRW_pass_nth_shgroup_get(passes->ob_center_pass, 0);
-	// DRW_shgroup_batch_calls_object_center(shgrp);
 }
 
 static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 419e5248bd..8daf97875b 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -149,29 +149,35 @@ typedef enum {
 	DRW_STATE_WIRE        = (1 << 6),
 	DRW_STATE_WIRE_LARGE  = (1 << 7),
 	DRW_STATE_POINT       = (1 << 8),
-	DRW_STATE_BLEND       = (1 << 9)
+	DRW_STATE_STIPPLE_2   = (1 << 9),
+	DRW_STATE_STIPPLE_3   = (1 << 10),
+	DRW_STATE_STIPPLE_4   = (1 << 11),
+	DRW_STATE_BLEND       = (1 << 12),
 } DRWState;
 
+/* Used by DRWShadingGroup.dyntype */
+#define DRW_DYN_POINTS 1
+#define DRW_DYN_LINES 2
+
 DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
-void DRW_shgroup_free(struct DRWShadingGroup *batch);
-void DRW_shgroup_call_add(DRWShadingGroup *batch, struct Batch *geom, const float **obmat);
-void DRW_shgroup_state_set(DRWShadingGroup *batch, DRWState state);
+void DRW_shgroup_free(struct DRWShadingGroup *shgroup);
+void DRW_shgroup_call_add(DRWShadingGroup *shgroup, struct Batch *geom, float (*obmat)[4]);
+void DRW_shgroup_state_set(DRWShadingGroup *shgroup, DRWState state);
+void DRW_shgroup_dyntype_set(DRWShadingGroup *shgroup, int type);
 
-void DRW_shgroup_uniform_texture(DRWShadingGroup *batch, const char *name, const struct GPUTexture *tex, int loc);
+void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const struct GPUTexture *tex, int loc);
 void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const struct GPUUniformBuffer *ubo, int loc);
-void DRW_shgroup_uniform_buffer(DRWShadingGroup *batch, const char *name, const int value, int loc);
-void DRW_shgroup_uniform_bool(DRWShadingGroup *batch, const char *name, const bool *value, int arraysize);
-void DRW_shgroup_uniform_float(DRWShadingGroup *batch, const char *name, const float *value, int arraysize);
-void DRW_shgroup_uniform_vec2(DRWShadingGroup *batch, const char *name, const float *value, int arraysize);
-void DRW_shgroup_uniform_vec3(DRWShadingGroup *batch, const char *name, const float *value, int arraysize);
-void DRW_shgroup_uniform_vec4(DRWShadingGroup *batch, const char *name, const float *value, int arraysize);
-void DRW_shgroup_uniform_int(DRWShadingGroup *batch, const char *name, const int *value, int arraysize);
-void DRW_shgroup_uniform_ivec2(DRWShadingGroup *batch, const char *name, const int *value, int arraysize);
-void DRW_shgroup_uniform_ivec3(DRWShadingGroup *batch, const char *name, const int *value, int arraysize);
-void DRW_shgroup_uniform_mat3(DRWShadingGroup *batch, const char *name, const float *value);
-void DRW_shgroup_uniform_mat4(DRWShadingGroup *batch, const char *name, const float *value);
-
-void DRW_shgroup_batch_calls_object_center(DRWShadingGroup *shgroup);
+void DRW_shgroup_uniform_buffer(DRWShadingGroup *shgroup, const char *name, const int value, int loc);
+void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const bool *value, int arraysize);
+void DRW_shgroup_uniform_float(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);
+void DRW_shgroup_uniform_vec2(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);
+void DRW_shgroup_uniform_vec3(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);
+void DRW_shgroup_uniform_vec4(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);
+void DRW_shgroup_uniform_int(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
+void DRW_shgroup_uniform_ivec2(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
+void DRW_shgroup_uniform_ivec3(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
+void DRW_shgroup_uniform_mat3(DRWShadingGroup *shgroup, const char *name, const float *value);
+void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, const char *name, const float *value);
 
 /* Passes */
 DRWPass *DRW_pass_create(const char *name, DRWState state);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index db7b5f8223..a2ddf07079 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -29,10 +29,12 @@
 #include "BLI_rect.h"
 #include "BLI_string.h"
 
-#include "BLT_translation.h"
+#include "BIF_glutil.h"
 
 #include "BKE_global.h"
 
+#include "BLT_translation.h"
+
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
@@ -101,7 +103,7 @@ struct DRWPass {
 typedef struct DRWCall {
 	struct DRWCall *next, *prev;
 	Batch *geometry;
-	float **obmat;
+	float(*obmat)[4];
 } DRWCall;
 
 struct DRWShadingGroup {
@@ -110,6 +112,8 @@ struct DRWShadingGroup {
 	struct DRWInterface *interface;  /* Uniforms pointers */
 	ListBase calls;                  /* List with all geometry and transforms */
 	int state;                       /* State changes for this batch only */
+	short dyntype;                   /* Dynamic Batch type, 0 is normal */
+	Batch *dyngeom;                  /* Dynamic batch */
 };
 
 /* Render State */
@@ -325,6 +329,8 @@ DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
 	shgroup->shader = shader;
 	shgroup->interface = DRW_interface_create(shader);
 	shgroup->state = 0;
+	shgroup->dyntype = 0;
+	shgroup->dyngeom = NULL;
 
 	BLI_listbase_clear(&shgroup->interface->uniforms);
 
@@ -338,10 +344,13 @@ void DRW_shgroup_free(struct DRWShadingGroup *shgroup)
 	BLI_freelistN(&shgroup->calls);
 	BLI_freelistN(&shgroup->interface->uniforms);
 	MEM_freeN(shgroup->interface);
+
+	if (shgroup->dyngeom)
+		Batch_discard(shgroup->dyngeom);
 }
 
 /* Later use VBO */
-void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, const float **obmat)
+void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, float (*obmat)[4])
 {
 	if (geom) {
 		DRWCall *call = MEM_callocN(sizeof(DRWCall), "DRWCall");
@@ -360,6 +369,11 @@ void DRW_shgroup_state_set(DRWShadingGroup *shgroup, DRWState state)
 	shgroup->state = state;
 }
 
+void DRW_shgroup_dyntype_set(DRWShadingGroup *shgroup, int type)
+{
+	shgroup->dyntype = type;
+}
+
 void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex, int loc)
 {
 	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 0, loc);
@@ -426,23 +440,27 @@ void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, const char *name, const
 	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_MAT4, value, 16, 1, 0);
 }
 
-/* TODO move it to GPUViewport */
-static Batch *obj_centers = NULL;
-
-void DRW_shgroup_batch_calls_object_center(DRWShadingGroup *shgroup)
+static void shgroup_dynamic_batch_from_calls(DRWShadingGroup *shgroup)
 {
+	int i = 0;
 	int nbr = BLI_listbase_count(&shgroup->calls);
+	GLenum type;
+
+	if (nbr == 0) {
+		if (shgroup->dyngeom) {
+			Batch_discard(shgroup->dyngeom);
+			shgroup->dyngeom = NULL;
+		}
+		return;
+	}
+
 	/* Gather Data */
 	float *data = MEM_mallocN(sizeof(float) * 3 * nbr , "Object Center Batch data");
 
-	// int i = 0;
-	// /* TODO do something more generic usable for other things than obj center */
-	// for (DRWCall *call = shgroup->calls.first; call; call = call->next) {
-	// 	float *v = data + i*3;
-	// 	float ob[3] = {0.0f,0.0f,0.0f};
-	// 	copy_v3_v3(v, ob);
-	// 	i++;
-	// }
+	/* TODO do something more generic usable for other things than obj center */
+	for (DRWCall *call = shgroup->calls.first; call; call = call->next, i++) {
+		copy_v3_v3(&data[i*3], call->obmat[3]);
+	}
 
 	/* Upload Data */
 	static VertexFormat format = { 0 };
@@ -456,21 +474,20 @@ void DRW_shgroup_batch_calls_object_center(DRWShadingGroup *shgroup)
 
 	fillAttrib(vbo, pos_id, data);
 
-	if (obj_centers)
-		Batch_discard(obj_centers);
+	if (shgroup->dyntype == DRW_DYN_POINTS)
+		type = GL_POINTS;
+	else
+		type = GL_LINES;
+
+	/* TODO make the batch dynamic instead of freeing it every times */
+	if (shgroup->dyngeom)
+		Batch_discard(shgroup->dyngeom);
 
-	obj_centers = Batch_create(GL_POINTS, vbo, NULL);
+	shgroup->dyngeom = Batch_create(type, vbo, NULL);
 
 	MEM_freeN(data);
-
-	/* Replacing multiple calls with only one */
-	BLI_freelistN(&shgroup->calls);
-	static float obmat[4][4];
-	unit_m4(obmat);
-	DRW_shgroup_call_add(shgroup, obj_centers, &obmat);
 }
 
-
 /* ***************************************** PASSES ******************************************/
 
 DRWPass *DRW_pass_create(const char *name, DRWState state)
@@ -542,15 +559,28 @@ void DRW_draw_background(void)
 	}
 }
 
+/* Only alter the state (does not reset it like set_state() ) */
 static void shgroup_set_state(DRWShadingGroup *shgroup)
 {
 	if (shgroup->state) {
+		/* Wire width */
 		if (shgroup->state & DRW_STATE_WIRE) {
 			glLineWidth(1.0f);
 		}
 		else if (shgroup->state & DRW_STATE_WIRE_LARGE) {
 			glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f);
 		}
+
+		/* Line Stip

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list