Commit: 3f052c6ab39d1a98332f883248e74933ab484cc8
Author: Lukas Tönne
Date:   Wed Jul 6 11:47:43 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB3f052c6ab39d1a98332f883248e74933ab484cc8

GPU buffer functions for drawing a strand edit BMesh.

Now the object mode and edit mode for strands use the same drawing code.
Derived render strands are not yet supported (they may need re-scattering
during editing) and the tool settings have no effect yet.

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

M       source/blender/blenkernel/BKE_editstrands.h
M       source/blender/blenkernel/intern/editstrands.c
M       source/blender/blenkernel/intern/strands.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/drawstrands.c
M       source/blender/editors/space_view3d/view3d_intern.h
M       source/blender/gpu/GPU_buffers.h
M       source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/BKE_editstrands.h 
b/source/blender/blenkernel/BKE_editstrands.h
index 9fb69ba..e8729af 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -55,9 +55,7 @@ typedef struct BMEditStrands {
        
        int flag;
        
-       unsigned int vertex_glbuf;
-       unsigned int elem_glbuf;
-       unsigned int dot_glbuf;
+       struct GPUDrawStrands *gpu_buffer;
 } BMEditStrands;
 
 /* BMEditStrands->flag */
diff --git a/source/blender/blenkernel/intern/editstrands.c 
b/source/blender/blenkernel/intern/editstrands.c
index f0d8ea6..fb078e4 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -55,6 +55,8 @@
 
 #include "BPH_strands.h"
 
+#include "GPU_buffers.h"
+
 #include "intern/bmesh_mesh_conv.h"
 #include "intern/bmesh_strands_conv.h"
 
@@ -76,6 +78,8 @@ BMEditStrands *BKE_editstrands_copy(BMEditStrands *es)
        es_copy->base.bm = BM_mesh_copy(es->base.bm);
        es_copy->root_dm = CDDM_copy(es->root_dm);
        
+       es_copy->gpu_buffer = NULL;
+       
        return es_copy;
 }
 
@@ -125,6 +129,9 @@ void BKE_editstrands_free(BMEditStrands *es)
                BM_mesh_free(es->base.bm);
        if (es->root_dm)
                es->root_dm->release(es->root_dm);
+       
+       if (es->gpu_buffer)
+               GPU_strands_buffer_free(es->gpu_buffer);
 }
 
 /* === constraints === */
diff --git a/source/blender/blenkernel/intern/strands.c 
b/source/blender/blenkernel/intern/strands.c
index 847bd5f..02a4c16 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -72,7 +72,6 @@ void BKE_strands_free(Strands *strands)
 {
        if (strands->gpu_shader)
                GPU_strand_shader_free(strands->gpu_shader);
-       GPU_strands_buffer_free(strands->data_final);
        
        if (strands->data_final)
                BKE_strand_data_free(strands->data_final);
@@ -163,7 +162,7 @@ StrandData *BKE_strand_data_calc(Strands *strands, 
DerivedMesh *scalp,
 void BKE_strand_data_free(StrandData *data)
 {
        if (data) {
-               GPU_strands_buffer_free(data);
+               GPU_strands_buffer_free(data->gpu_buffer);
                
                if (data->verts)
                        MEM_freeN(data->verts);
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index fa976de..6b29232 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7977,17 +7977,20 @@ void draw_object(Scene *scene, ARegion *ar, View3D 
*v3d, Base *base, const short
                if (md->type == eModifierType_Strands) {
                        StrandsModifierData *smd = (StrandsModifierData *)md;
                        BMEditStrands *edit = (ob->mode & OB_MODE_HAIR_EDIT && 
is_obact) ? smd->edit : NULL;
+                       bool show_controls = smd->flag & 
MOD_STRANDS_SHOW_CONTROL_STRANDS;
+                       bool show_strands = smd->flag & 
MOD_STRANDS_SHOW_RENDER_STRANDS;
                        
                        if (edit) {
                                if (!(dflag & DRAW_PICKING) && scene->obedit == 
NULL) {
-                                       draw_strands_edit_hair(scene, v3d, ar, 
edit);
+                                       draw_strands_edit_hair(scene, v3d, 
rv3d, ob,
+                                                              smd->strands, 
edit,
+                                                              show_controls, 
show_strands);
                                }
                        }
                        else {
                                if (smd->strands && smd->strands->data_final) {
-                                       bool show_controls = smd->flag & 
MOD_STRANDS_SHOW_CONTROL_STRANDS;
-                                       bool show_strands = smd->flag & 
MOD_STRANDS_SHOW_RENDER_STRANDS;
-                                       draw_strands(smd->strands, 
smd->strands->data_final, ob, rv3d,
+                                       draw_strands(scene, v3d, rv3d, ob,
+                                                    smd->strands, 
smd->strands->data_final,
                                                     show_controls, 
show_strands);
                                }
                        }
diff --git a/source/blender/editors/space_view3d/drawstrands.c 
b/source/blender/editors/space_view3d/drawstrands.c
index 7161de7..4014dd8 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -66,7 +66,8 @@
 
 #include "view3d_intern.h"  // own include
 
-void draw_strands(Strands *strands, StrandData *data, Object *ob, RegionView3D 
*rv3d,
+void draw_strands(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D 
*rv3d,
+                  Object *ob, Strands *strands, StrandData *data,
                   bool show_controls, bool show_strands)
 {
        GPUStrandsShader *gpu_shader = GPU_strand_shader_get(strands);
@@ -108,6 +109,7 @@ void draw_strands(Strands *strands, StrandData *data, 
Object *ob, RegionView3D *
 /*************************/
 /*** Edit Mode Drawing ***/
 
+#if 0
 typedef enum StrandsShadeMode {
        STRANDS_SHADE_FLAT,
        STRANDS_SHADE_HAIR,
@@ -413,9 +415,25 @@ static void draw_dots(BMEditStrands *edit, const 
StrandsDrawInfo *info, bool sel
        if (totelem > 0)
                glDrawArrays(GL_POINTS, 0, totelem);
 }
+#endif
 
-void draw_strands_edit_hair(Scene *scene, View3D *v3d, ARegion *UNUSED(ar), 
BMEditStrands *edit)
+void draw_strands_edit_hair(Scene *UNUSED(scene), View3D *UNUSED(v3d), 
RegionView3D *rv3d,
+                            Object *ob, Strands *strands, BMEditStrands *edit,
+                            bool show_controls, bool show_strands)
 {
+       GPUStrandsShader *gpu_shader = GPU_strand_shader_get(strands);
+       
+       if (show_controls) {
+               GPU_editstrands_setup_edges(edit);
+               GPUDrawStrands *gds = edit->gpu_buffer;
+               if (gds->control_points && gds->control_edges) {
+                       GPU_buffer_draw_elements(gds->control_edges, GL_LINES, 
0,
+                                                (gds->totverts - 
gds->totcurves) * 2);
+               }
+               GPU_buffers_unbind();
+       }
+       
+#if 0
        HairEditSettings *settings = &scene->toolsettings->hair_edit;
        
        StrandsDrawInfo info;
@@ -436,4 +454,5 @@ void draw_strands_edit_hair(Scene *scene, View3D *v3d, 
ARegion *UNUSED(ar), BMEd
        unbind_gpu_buffers_dots();
        
        restore_opengl_state(&info);
+#endif
 }
diff --git a/source/blender/editors/space_view3d/view3d_intern.h 
b/source/blender/editors/space_view3d/view3d_intern.h
index 3e9c99b..ec47ad5 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -289,10 +289,13 @@ ARegion *view3d_has_tools_region(ScrArea *sa);
 extern const char *view3d_context_dir[]; /* doc access */
 
 /* drawstrands.c */
-void draw_strands(struct Strands *strands, struct StrandData *data, struct 
Object *ob, struct RegionView3D *rv3d,
+void draw_strands(struct Scene *scene, struct View3D *v3d, struct RegionView3D 
*rv3d,
+                  struct Object *ob, struct Strands *strands, struct 
StrandData *data,
                   bool show_controls, bool show_strands);
 
-void draw_strands_edit_hair(Scene *scene, View3D *v3d, ARegion *ar, struct 
BMEditStrands *edit);
+void draw_strands_edit_hair(struct Scene *scene, struct View3D *v3d, struct 
RegionView3D *rv3d,
+                            struct Object *ob, struct Strands *strands, struct 
BMEditStrands *edit,
+                            bool show_controls, bool show_strands);
 
 /* drawvolume.c */
 void draw_smoke_volume(struct SmokeDomainSettings *sds, struct Object *ob,
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 32f2192..fa9decc 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -53,6 +53,7 @@ struct GridCommonGPUBuffer;
 struct PBVH;
 struct MVert;
 struct StrandData;
+struct BMEditStrands;
 
 typedef struct GPUBuffer {
        size_t size;        /* in bytes */
@@ -295,8 +296,12 @@ void GPU_strands_setup_verts(struct StrandData *strands);
 void GPU_strands_setup_edges(struct StrandData *strands);
 void GPU_strands_setup_roots(struct StrandData *strands);
 
+void GPU_editstrands_setup_verts(struct BMEditStrands *strands);
+void GPU_editstrands_setup_edges(struct BMEditStrands *strands);
+void GPU_editstrands_setup_roots(struct BMEditStrands *strands);
+
 void GPU_strands_buffer_unbind(void);
 
-void GPU_strands_buffer_free(struct StrandData *strands);
+void GPU_strands_buffer_free(struct GPUDrawStrands *gpu_buffer);
 
 #endif
diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index 61e64fd..1fed60a 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -50,6 +50,7 @@
 
 #include "BKE_ccg.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_editstrands.h"
 #include "BKE_paint.h"
 #include "BKE_mesh.h"
 #include "BKE_pbvh.h"
@@ -2181,12 +2182,12 @@ static GPUBufferTexture 
*gpu_strands_buffer_texture_from_type(GPUDrawStrands *gd
 }
 
 /* get the amount of space to allocate for a buffer of a particular type */
-static size_t gpu_strands_buffer_size_from_type(StrandData *strands, 
GPUStrandBufferType type)
+static size_t gpu_strands_buffer_size_from_type(GPUDrawStrands *gpu_buffer, 
GPUStrandBufferType type)
 {
        const int components = 
gpu_strand_buffer_type_settings[type].num_components;
-       const int totverts = strands->gpu_buffer->totverts;
-       const int totcurves = strands->gpu_buffer->totcurves;
-       const int totroots = strands->gpu_buffer->totroots;
+       const int totverts = gpu_buffer->totverts;
+       const int totcurves = gpu_buffer->totcurves;
+       const int totroots = gpu_buffer->totroots;
        
        switch (type) {
                case GPU_STRAND_BUFFER_CONTROL_VERTEX:
@@ -2202,6 +2203,84 @@ static size_t 
gpu_strands_buffer_size_from_type(StrandData *strands, GPUStrandBu
        }
 }
 
+typedef void (*StrandsCopyGPUDataCb)(void *userdata, GPUStrandBufferType type, 
float *varray);
+
+static GPUBuffer *gpu_strands_setup_buffer_type(GPUDrawStrands *gpu_buffer,
+                                                GPUStrandBufferType type,
+                                                StrandsCopyGPUDataCb copy_data,
+                                                void *userdata,
+                                                GPUBuffer *buffer)
+{
+       GPUBufferPool *pool;
+       float *varray;
+       const GPUBufferTypeSettings *ts = 
&gpu_strand_buffer_type_settings[type];
+       GLenum target = ts->gl_buffer_type;
+       size_t size = gpu_strands_buffer_size_from_type(gpu_buffer, type);
+
+       pool = gpu_get_global_buffer_pool();
+
+       BLI_mutex_lock(&buffer_mutex);
+
+       /* alloc a GPUBuffer; fall back to legacy mode on failure */
+       if (!buffer) {
+               if (!(buffer = gpu_buffer_alloc_intern(size))) {
+                       BLI_mutex_unlock(&buffer_mutex);
+                       return NULL;
+               }
+       }
+
+       /* bind the buffer and discard previous data,
+        * avoids stalling gpu */
+       glBindBuffer(target, bu

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to