Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-05-11 14:21:59 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-05-11 14:27:33 +0300
commit5ae58f8ab889abfc8a1c8d9538ae0b4dea989408 (patch)
tree779b65eefad9749923cc8518802bd5d5a2dc2011 /source/blender/gpu
parentf1242ea93b1cdbd8a6125e1760146db187075c79 (diff)
DWM: Use draw manager for sculpt PBVH drawing
Add a shader-group type to draw generated geometry by running a callback.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/GPU_buffers.h2
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c48
2 files changed, 23 insertions, 27 deletions
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 958d5aed4a4..661562e2e4c 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -51,6 +51,7 @@ struct GPUVertPointLink;
struct GPUDrawObject;
struct GridCommonGPUBuffer;
struct PBVH;
+struct Batch;
struct MVert;
typedef struct GPUBuffer {
@@ -257,6 +258,7 @@ void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, struct CCGElem **gr
/* draw */
void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
bool wireframe, bool fast);
+struct Batch *GPU_draw_pbvh_buffers_get_batch(GPU_PBVH_Buffers *buffers, bool fast);
/* debug PBVH draw */
void GPU_draw_pbvh_BB(float min[3], float max[3], bool leaf, unsigned int pos);
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 707bdf7d829..8a3c0c91b65 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1015,10 +1015,6 @@ static void gpu_pbvh_vert_format_init__gwn(VertexFormat *format, VertexBufferAtt
static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
{
- GPUBuiltinShader shader_id =
- buffers->smooth ? GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR : GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR;
- GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
-
/* force flushing to the GPU */
if (buffers->vert_buf->data) {
VertexBuffer_use(buffers->vert_buf);
@@ -1029,10 +1025,6 @@ static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
PRIM_TRIANGLES, buffers->vert_buf,
/* can be NULL */
buffers->index_buf);
- Batch_set_program(
- buffers->triangles,
- GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
-
BATCH_DISCARD_SAFE(buffers->triangles_fast);
if (buffers->index_buf_fast) {
@@ -1040,10 +1032,6 @@ static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
PRIM_TRIANGLES, buffers->vert_buf,
/* can be NULL */
buffers->index_buf_fast);
-
- Batch_set_program(
- buffers->triangles_fast,
- GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
}
}
@@ -1214,7 +1202,13 @@ GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(
buffers = MEM_callocN(sizeof(GPU_PBVH_Buffers), "GPU_Buffers");
+ /* smooth or flat for all */
+#if 0
buffers->smooth = mpoly[looptri[face_indices[0]].poly].flag & ME_SMOOTH;
+#else
+ /* for DrawManager we dont support mixed smooth/flat */
+ buffers->smooth = (mpoly[0].flag & ME_SMOOTH) != 0;
+#endif
buffers->show_diffuse_color = false;
buffers->use_matcaps = false;
@@ -1830,29 +1824,29 @@ void GPU_draw_pbvh_buffers(
bool wireframe, bool fast)
{
UNUSED_VARS(wireframe, fast, setMaterial);
-
- {
- GPUBuiltinShader shader_id =
- buffers->smooth ? GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR : GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR;
- GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
-
- static float light[3] = {-0.3f, 0.5f, 1.0f};
- static float alpha = 1.0f;
- static float world_light = 1.0f;
-
- GPU_shader_uniform_vector(shader, GPU_shader_get_uniform(shader, "light"), 3, 1, light);
- GPU_shader_uniform_vector(shader, GPU_shader_get_uniform(shader, "alpha"), 1, 1, &alpha);
- GPU_shader_uniform_vector(shader, GPU_shader_get_uniform(shader, "global"), 1, 1, &world_light);
- }
-
bool do_fast = fast && buffers->triangles_fast;
Batch *triangles = do_fast ? buffers->triangles_fast : buffers->triangles;
if (triangles) {
+ if (triangles->interface == NULL) {
+ GPUBuiltinShader shader_id =
+ buffers->smooth ? GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR : GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR;
+ GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
+
+ Batch_set_program(
+ triangles,
+ GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
+ }
Batch_draw(triangles);
}
}
+Batch *GPU_draw_pbvh_buffers_get_batch(GPU_PBVH_Buffers *buffers, bool fast)
+{
+ return (fast && buffers->triangles_fast) ?
+ buffers->triangles_fast : buffers->triangles;
+}
+
bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, GSet *bm_faces, bool show_diffuse_color)
{
float diffuse_color[4];