[Bf-blender-cvs] [666fe94] strand_gpu: GPU code for vertex and edge buffers of strands.
Lukas Tönne
noreply at git.blender.org
Tue Jul 5 09:56:59 CEST 2016
Commit: 666fe947afac6292cc8e41fc1d9c4a987f9c25a7
Author: Lukas Tönne
Date: Thu Jun 30 13:12:21 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB666fe947afac6292cc8e41fc1d9c4a987f9c25a7
GPU code for vertex and edge buffers of strands.
This is a modification of the DerivedMesh code, which relies too much
on the DerivedMesh data structure to be used directly.
===================================================================
M source/blender/blenkernel/BKE_strands.h
M source/blender/blenkernel/intern/strands.c
M source/blender/blenloader/intern/readfile.c
M source/blender/editors/space_view3d/drawobject.c
M source/blender/editors/space_view3d/drawstrands.c
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/GPU_strands.h
M source/blender/gpu/intern/gpu_buffers.c
M source/blender/gpu/intern/gpu_strands.c
M source/blender/makesdna/DNA_strand_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_strands.h b/source/blender/blenkernel/BKE_strands.h
index 539369b..56c7940 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -37,7 +37,7 @@
#include "DNA_strand_types.h"
struct DerivedMesh;
-struct GPUStrands;
+struct GPUStrandsShader;
static const unsigned int STRAND_INDEX_NONE = 0xFFFFFFFF;
@@ -45,10 +45,18 @@ struct Strands *BKE_strands_new(void);
struct Strands *BKE_strands_copy(struct Strands *strands);
void BKE_strands_free(struct Strands *strands);
+/* ------------------------------------------------------------------------- */
+
+struct StrandData *BKE_strand_data_calc(Strands *strands);
+void BKE_strand_data_free(struct StrandData *data);
+
+/* ------------------------------------------------------------------------- */
+
void BKE_strands_test_init(struct Strands *strands, struct DerivedMesh *scalp,
int totcurves, int maxverts,
unsigned int seed);
+
struct StrandInfo *BKE_strands_scatter(struct DerivedMesh *scalp, unsigned int amount,
const StrandCurve *controls, unsigned int num_controls,
unsigned int seed);
diff --git a/source/blender/blenkernel/intern/strands.c b/source/blender/blenkernel/intern/strands.c
index 2415fb6..aa98883 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -35,9 +35,11 @@
#include "BLI_math.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_mesh_sample.h"
#include "BKE_strands.h"
+#include "GPU_buffers.h"
#include "GPU_strands.h"
Strands *BKE_strands_new(void)
@@ -58,15 +60,17 @@ Strands *BKE_strands_copy(Strands *strands)
}
/* lazy initialized */
- nstrands->gpu_strands = NULL;
+ nstrands->gpu_shader = NULL;
+ nstrands->gpu_buffer = NULL;
return nstrands;
}
void BKE_strands_free(Strands *strands)
{
- if (strands->gpu_strands)
- GPU_strands_free(strands->gpu_strands);
+ if (strands->gpu_shader)
+ GPU_strand_shader_free(strands->gpu_shader);
+ GPU_strands_buffer_free(strands);
if (strands->curves)
MEM_freeN(strands->curves);
@@ -98,7 +102,7 @@ void BKE_strands_test_init(struct Strands *strands, struct DerivedMesh *scalp,
for (k = 0; k < c->num_verts; ++k, ++v) {
v->co[0] = 0.0f;
v->co[1] = 0.0f;
- v->co[2] = (c->num_verts > 1) ? 1.0f / (c->num_verts - 1) : 0.0f;
+ v->co[2] = (c->num_verts > 1) ? (float)k / (c->num_verts - 1) : 0.0f;
}
verts_begin += c->num_verts;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 72d1258..43ffb59 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4312,7 +4312,8 @@ static void direct_link_strands(FileData *fd, Strands *strands)
strands->verts = newdataadr(fd, strands->verts);
/* runtime */
- strands->gpu_strands = NULL;
+ strands->gpu_shader = NULL;
+ strands->gpu_buffer = NULL;
}
/* ************ READ MESH ***************** */
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 206ab18..accd021 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7970,8 +7970,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
if (md->type == eModifierType_Strands) {
StrandsModifierData *smd = (StrandsModifierData *)md;
- if (smd->strands)
+ if (smd->strands) {
draw_strands(smd->strands, ob, rv3d);
+ }
}
}
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index 88a5e3d..952aef2 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -40,10 +40,12 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_strands.h"
#include "BIF_gl.h"
+#include "GPU_buffers.h"
#include "GPU_debug.h"
#include "GPU_shader.h"
#include "GPU_strands.h"
@@ -52,11 +54,20 @@
void draw_strands(Strands *strands, Object *ob, RegionView3D *rv3d)
{
- GPUStrands *gpu_strands = GPU_strands_get(strands);
+ GPUStrandsShader *gpu_shader = GPU_strand_shader_get(strands);
+ GPUDrawStrands *gds;
- GPU_strands_bind_uniforms(gpu_strands, ob->obmat, rv3d->viewmat);
- GPU_strands_bind(gpu_strands, rv3d->viewmat, rv3d->viewinv);
+ GPU_strand_shader_bind_uniforms(gpu_shader, ob->obmat, rv3d->viewmat);
+ GPU_strand_shader_bind(gpu_shader, rv3d->viewmat, rv3d->viewinv);
+ GPU_strands_setup(strands);
+ gds = strands->gpu_buffer;
+ if (gds->points && gds->edges) {
+ GPU_buffer_draw_elements(gds->edges, GL_LINES, 0, (gds->totverts - gds->totcurves) * 2);
+ }
+ GPU_buffers_unbind();
+
+#if 0
GLuint vertex_buffer;
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
@@ -80,6 +91,7 @@ void draw_strands(Strands *strands, Object *ob, RegionView3D *rv3d)
/* cleanup */
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &vertex_buffer);
+#endif
- GPU_strands_unbind(gpu_strands);
+ GPU_strand_shader_unbind(gpu_shader);
}
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 7972d13..3f7a3c5 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -52,6 +52,7 @@ struct GPUDrawObject;
struct GridCommonGPUBuffer;
struct PBVH;
struct MVert;
+struct Strands;
typedef struct GPUBuffer {
size_t size; /* in bytes */
@@ -143,6 +144,20 @@ typedef struct GPUVertPointLink {
int point_index;
} GPUVertPointLink;
+typedef struct GPUDrawStrands {
+ GPUBuffer *points;
+ GPUBuffer *normals;
+ GPUBuffer *uv;
+ GPUBuffer *uv_tex;
+ GPUBuffer *colors;
+ GPUBuffer *edges;
+ GPUBuffer *uvedges;
+ GPUBuffer *triangles; /* triangle index buffer */
+
+ unsigned int totverts;
+ unsigned int totcurves;
+} GPUDrawStrands;
+
/* used for GLSL materials */
@@ -268,4 +283,9 @@ bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm
void GPU_free_pbvh_buffers(GPU_PBVH_Buffers *buffers);
void GPU_free_pbvh_buffer_multires(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
+/* strands */
+
+void GPU_strands_setup(struct Strands *strands);
+void GPU_strands_buffer_free(struct Strands *strands);
+
#endif
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index 7d73b38..c3a58d3 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -38,20 +38,20 @@ extern "C" {
struct Strands;
-typedef struct GPUStrands GPUStrands;
+typedef struct GPUStrandsShader GPUStrandsShader;
-GPUStrands *GPU_strands_get(struct Strands *strands);
+GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands);
-void GPU_strands_free(struct GPUStrands *gpu_strands);
+void GPU_strand_shader_free(struct GPUStrandsShader *gpu_shader);
-void GPU_strands_bind(
- GPUStrands *gpu_strands,
+void GPU_strand_shader_bind(
+ GPUStrandsShader *gpu_shader,
float viewmat[4][4], float viewinv[4][4]);
-void GPU_strands_bind_uniforms(
- GPUStrands *gpu_strands,
+void GPU_strand_shader_bind_uniforms(
+ GPUStrandsShader *gpu_shader,
float obmat[4][4], float viewmat[4][4]);
-void GPU_strands_unbind(GPUStrands *gpu_strands);
-bool GPU_strands_bound(GPUStrands *gpu_strands);
+void GPU_strand_shader_unbind(GPUStrandsShader *gpu_shader);
+bool GPU_strand_shader_bound(GPUStrandsShader *gpu_shader);
#ifdef __cplusplus
}
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 36d297f..c13e6f5 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -46,12 +46,14 @@
#include "BLI_threads.h"
#include "DNA_meshdata_types.h"
+#include "DNA_strand_types.h"
#include "BKE_ccg.h"
#include "BKE_DerivedMesh.h"
#include "BKE_paint.h"
#include "BKE_mesh.h"
#include "BKE_pbvh.h"
+#include "BKE_strands.h"
#include "GPU_buffers.h"
#include "GPU_draw.h"
@@ -74,7 +76,7 @@ typedef struct {
} GPUBufferTypeSettings;
-static size_t gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type);
+static size_t gpu_mesh_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type);
const GPUBufferTypeSettings gpu_buffer_type_settings[] = {
/* vertex */
@@ -464,7 +466,7 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
int i;
const GPUBufferTypeSettings *ts = &gpu_buffer_type_settings[type];
GLenum target = ts->gl_buffer_type;
- size_t size = gpu_buffer_size_from_type(dm, type);
+ size_t size = gpu_mesh_buffer_size_from_type(dm, type);
GLboolean uploaded;
pool = gpu_get_global_buffer_pool();
@@ -550,7 +552,7 @@ static GPUBuffer **gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBuffer
}
/* get the amount of space to allocate for a buffer of a particular type */
-static size_t gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type)
+static size_t gpu_mesh_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type)
{
const int components = gpu_buffer_type_settings[type].num_components;
switch (type) {
@@ -2089,3 +2091,228 @@ void GPU_end_draw_pbvh_BB(void)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPopAttrib();
}
+
+/* *************** */
+/* Strands Buffers */
+
+/* get the GPUDrawObject buffer associated with a type */
+static GPUBuffer **gpu_strands_buffer_from_type(GPUDrawStrands *gds, GPUBufferType type)
+{
+ switch (type) {
+ case GPU_BUFFER_VERTEX:
+ return &gds->points;
+ case GPU_BUFFER_NORMAL:
+ return &gds->normals;
+ case GPU_BUFFER_COLOR:
+ return &gds->colors;
+ case GPU_BUFFER_UV:
+ return &gds->uv;
+ case GPU_BUFFER_UV_TEXPAINT:
+ return &gds->uv_tex;
+ case GPU_BUFFER_EDGE:
+ return &gds->edges;
+ case GPU_BUFFER_UVEDGE:
+ return &gds->uvedges;
+ case GPU_BUFFER_TRIANGLES:
+ return &gds->triangles;
+ default:
+ return NULL;
+ }
+}
+
+/* get the amount of space to allocate for a buffer o
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list