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); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs