[Bf-blender-cvs] [d16bfecde1] clay-engine: Removing Bases from clay.c and other fixes

Dalai Felinto noreply at git.blender.org
Mon Jan 9 17:52:12 CET 2017


Commit: d16bfecde11ff76592b42f7c542627e7caceeadb
Author: Dalai Felinto
Date:   Mon Jan 9 17:52:06 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBd16bfecde11ff76592b42f7c542627e7caceeadb

Removing Bases from clay.c and other fixes

Listbase was used wrongly in draw_manager, using LinkData elements now

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

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/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_intern.h

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

diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 6203f56fb7..f37858c9e5 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -243,6 +243,7 @@ static void clay_init_view(CLAY_FramebufferList *buffers, CLAY_TextureList *text
 static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C)
 {
 	Scene *scene = CTX_data_scene(C);
+	SceneLayer *sl = CTX_data_scene_layer(C);
 	Scene *sce_iter;
 	Base *base;
 	struct DRWBatch *matcapbatch, *depthbatch;
@@ -280,15 +281,23 @@ static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C
 		pop_clay = true;
 	}
 
-	for (SETLOOPER(scene, sce_iter, base)) {
+	Object *ob;
+	FOREACH_OBJECT(sl, ob)
+	{
 		/* Create hash table of batch based on material id*/
 
 		/* Add everything for now */
-		if (pop_clay) DRW_batch_add_surface(matcapbatch, base);
-		if (pop_depth) DRW_batch_add_surface(depthbatch, base);
+		if (pop_clay) {
+			DRW_batch_add_surface(matcapbatch, ob);
+		}
+
+		if (pop_depth) {
+			DRW_batch_add_surface(depthbatch, ob);
+		}
 
 		/* Free hash table */
 	}
+	FOREACH_OBJECT_END
 }
 
 static void clay_ssao_setup(void)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 52bc5bc4ed..6ae7d96223 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -29,6 +29,7 @@
 #define __DRW_RENDER_H__
 
 #include "BKE_context.h"
+#include "BKE_layer.h"
 #include "BKE_scene.h"
 
 #include "BLI_listbase.h"
@@ -38,6 +39,7 @@
 
 #include "BLT_translation.h"
 
+#include "DNA_object_types.h"
 #include "DNA_material_types.h"
 #include "DNA_scene_types.h"
 
@@ -48,6 +50,7 @@
 struct GPUFrameBuffer;
 struct GPUShader;
 struct GPUTexture;
+struct Object;
 
 typedef struct DRWUniform DRWUniform;
 typedef struct DRWInterface DRWInterface;
@@ -97,7 +100,8 @@ void DRW_shader_free(struct GPUShader *shader);
 
 /* Batches */
 DRWBatch *DRW_batch_create(struct GPUShader *shader, DRWPass *pass);
-void DRW_batch_add_surface(DRWBatch *batch, Base *base);
+void DRW_batch_free(struct DRWBatch *batch);
+void DRW_batch_add_surface(DRWBatch *batch, struct Object *ob);
 
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const struct GPUTexture *tex, int loc);
 void DRW_batch_uniform_buffer(DRWBatch *batch, const char *name, const int value, int loc);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index ee4e97bf57..b2226d559e 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -100,9 +100,9 @@ struct DRWPass {
 
 struct DRWBatch {
 	struct DRWBatch *next, *prev;
-	struct GPUShader *shader;        // Shader to bind
-	struct DRWInterface *interface;  // Uniforms values
-	ListBase objects;               // List with all objects and transform
+	struct GPUShader *shader;        /* Shader to bind */
+	struct DRWInterface *interface;  /* Uniforms values */
+	ListBase objects;               /* (Object *) LinkData->data - List with all objects and transform */
 };
 
 /* Render State */
@@ -251,10 +251,21 @@ DRWBatch *DRW_batch_create(struct GPUShader *shader, DRWPass *pass)
 	return batch;
 }
 
+void DRW_batch_free(struct DRWBatch *batch)
+{
+	for (LinkData *link = batch->objects.first; link; link = link->next) {
+		MEM_freeN(link->data);
+	}
+	BLI_freelistN(&batch->objects);
+
+	BLI_freelistN(&batch->interface->uniforms);
+	MEM_freeN(batch->interface);
+}
+
 /* Later use VBO */
-void DRW_batch_add_surface(DRWBatch *batch, Base *base)
+void DRW_batch_add_surface(DRWBatch *batch, Object *ob)
 {
-	BLI_addtail(&batch->objects, base);
+	BLI_addtail(&batch->objects, BLI_genericNodeN(ob));
 }
 
 void DRW_batch_uniform_texture(DRWBatch *batch, const char *name, const GPUTexture *tex, int loc)
@@ -326,8 +337,7 @@ DRWPass *DRW_pass_create(const char *name, DRWState state)
 void DRW_pass_free(DRWPass *pass)
 {
 	for (DRWBatch *batch = pass->batches.first; batch; batch = batch->next) {
-		BLI_freelistN(&batch->interface->uniforms);
-		MEM_freeN(batch->interface);
+		DRW_batch_free(batch);
 	}
 	BLI_freelistN(&pass->batches);
 	MEM_freeN(pass);
@@ -443,23 +453,25 @@ static void draw_batch(DRWBatch *batch, const bool fullscreen)
 	else {
 		RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
 
-		for (Base *base = batch->objects.first; base; base = base->next) {
+		for (LinkData *link = batch->objects.first; link; link = link->next) {
+			Object *ob = link->data;
+
 			/* Should be really simple */
 			/* step 1 : bind object dependent matrices */
 			if (interface->modelviewprojection != -1) {
 				float mvp[4][4];
-				mul_m4_m4m4(mvp, rv3d->persmat, base->object->obmat);
+				mul_m4_m4m4(mvp, rv3d->persmat, ob->obmat);
 				GPU_shader_uniform_vector(batch->shader, interface->modelviewprojection, 16, 1, (float *)mvp);
 			}
 			if (interface->modelview != -1) {
 				float mv[4][4];
-				mul_m4_m4m4(mv, rv3d->viewmat, base->object->obmat);
+				mul_m4_m4m4(mv, rv3d->viewmat, ob->obmat);
 				GPU_shader_uniform_vector(batch->shader, interface->modelview, 16, 1, (float *)mv);
 			}
 			if (interface->normal != -1) {
 				float mv[4][4];
 				float n[3][3];
-				mul_m4_m4m4(mv, rv3d->viewmat, base->object->obmat);
+				mul_m4_m4m4(mv, rv3d->viewmat, ob->obmat);
 				copy_m3_m4(n, mv);
 				invert_m3(n);
 				transpose_m3(n);
@@ -467,7 +479,8 @@ static void draw_batch(DRWBatch *batch, const bool fullscreen)
 			}
 
 			/* step 2 : bind vertex array & draw */
-			draw_mesh(base, DST.context, GPU_shader_get_program(batch->shader));
+			/* we won't use any function that doesn't comply to the new API, this is a short-lived exception TODO */
+			draw_mesh(ob, DST.context, GPU_shader_get_program(batch->shader));
 		}
 	}
 }
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 64276136f1..ecb3914ed1 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4372,16 +4372,13 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d,
 }
 
 /* Clement : temp solution to draw something simply */
-void draw_mesh(Base *base, const struct bContext *C, unsigned int program)
+void draw_mesh(Object *ob, const struct bContext *C, unsigned int program)
 {
-	Object *ob = base->object;
-	RegionView3D *rv3d = CTX_wm_region_view3d(C);
 	Scene *scene = CTX_data_scene(C);
-	View3D *v3d = CTX_wm_view3d(C);
 
 	if (ob->type == OB_MESH) {
 		Mesh *me = ob->data;
-		DerivedMesh *dm = NULL, *edm = NULL;
+		DerivedMesh *dm = NULL;
 
 		if (ob->mode & OB_MODE_EDIT) {
 			dm = editbmesh_get_derived_base(ob, me->edit_btmesh, CD_MASK_BAREMESH);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 70d8bd97fa..6b1ee8a360 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -142,7 +142,7 @@ void draw_motion_paths_cleanup(View3D *v3d);
 
 
 /* drawobject.c */
-void draw_mesh(Base *base, const struct bContext *C, unsigned int program);
+void draw_mesh(struct Object *ob, const struct bContext *C, unsigned int program);
 
 void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, const short dflag);
 void draw_mesh_object_outline(View3D *v3d, Object *ob, struct DerivedMesh *dm);




More information about the Bf-blender-cvs mailing list