[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