[Bf-blender-cvs] [87b65f1] strand_gpu: Intermediate struct StrandData for storing base data for drawing.
Lukas Tönne
noreply at git.blender.org
Tue Jul 5 09:57:01 CEST 2016
Commit: 87b65f1324dbc56a259cdbc99d6d34138d0c0f5e
Author: Lukas Tönne
Date: Thu Jun 30 18:37:45 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB87b65f1324dbc56a259cdbc99d6d34138d0c0f5e
Intermediate struct StrandData for storing base data for drawing.
This is equivalent to the DerivedMesh stage in the Mesh -> DM -> GPUBuffer
pipeline. The Strands struct is the base editable user data, StrandsData
is preprocessed data with evaluated root matrices and applied for object
space drawing.
===================================================================
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/editors/space_view3d/view3d_intern.h
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/intern/gpu_buffers.c
M source/blender/makesdna/DNA_strand_types.h
M source/blender/modifiers/intern/MOD_strands.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_strands.h b/source/blender/blenkernel/BKE_strands.h
index 56c7940..f73294f 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -47,7 +47,37 @@ void BKE_strands_free(struct Strands *strands);
/* ------------------------------------------------------------------------- */
-struct StrandData *BKE_strand_data_calc(Strands *strands);
+typedef struct StrandVertexData {
+ /* Position */
+ float co[3];
+ int pad;
+} StrandVertexData;
+
+typedef struct StrandCurveData {
+ /* Start of vertex list */
+ unsigned int verts_begin;
+ /* Number of vertices in the curve */
+ unsigned int num_verts;
+
+ /* Transform from strand space to object space */
+ float mat[4][4];
+} StrandCurveData;
+
+typedef struct StrandData {
+ /* Array of vertices */
+ StrandVertexData *verts;
+ /* Array of curves */
+ StrandCurveData *curves;
+
+ /* Total number of vertices */
+ int totverts;
+ /* Total number of curves */
+ int totcurves;
+
+ struct GPUDrawStrands *gpu_buffer;
+} StrandData;
+
+struct StrandData *BKE_strand_data_calc(struct Strands *strands, struct DerivedMesh *scalp);
void BKE_strand_data_free(struct StrandData *data);
/* ------------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/strands.c b/source/blender/blenkernel/intern/strands.c
index aa98883..e07b09a 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -61,7 +61,7 @@ Strands *BKE_strands_copy(Strands *strands)
/* lazy initialized */
nstrands->gpu_shader = NULL;
- nstrands->gpu_buffer = NULL;
+ nstrands->data_final = NULL;
return nstrands;
}
@@ -70,7 +70,10 @@ void BKE_strands_free(Strands *strands)
{
if (strands->gpu_shader)
GPU_strand_shader_free(strands->gpu_shader);
- GPU_strands_buffer_free(strands);
+ GPU_strands_buffer_free(strands->data_final);
+
+ if (strands->data_final)
+ BKE_strand_data_free(strands->data_final);
if (strands->curves)
MEM_freeN(strands->curves);
@@ -79,6 +82,53 @@ void BKE_strands_free(Strands *strands)
MEM_freeN(strands);
}
+/* ------------------------------------------------------------------------- */
+
+StrandData *BKE_strand_data_calc(Strands *strands, DerivedMesh *scalp)
+{
+ StrandData *data = MEM_callocN(sizeof(StrandData), "StrandData");
+
+ data->totverts = strands->totverts;
+ data->totcurves = strands->totcurves;
+ data->verts = MEM_mallocN(sizeof(StrandVertexData) * data->totverts, "StrandVertexData");
+ data->curves = MEM_mallocN(sizeof(StrandCurveData) * data->totcurves, "StrandCurveData");
+
+ int c;
+ StrandCurve *scurve = strands->curves;
+ StrandCurveData *curve = data->curves;
+ for (c = 0; c < data->totcurves; ++c, ++scurve, ++curve) {
+ curve->verts_begin = scurve->verts_begin;
+ curve->num_verts = scurve->num_verts;
+
+ BKE_mesh_sample_eval(scalp, &scurve->root, curve->mat[3], curve->mat[2], curve->mat[0]);
+ cross_v3_v3v3(curve->mat[1], curve->mat[2], curve->mat[0]);
+
+ int v;
+ StrandVertex *svert = strands->verts + scurve->verts_begin;
+ StrandVertexData *vert = data->verts + curve->verts_begin;
+ for (v = 0; v < curve->num_verts; ++v, ++svert, ++vert) {
+ mul_v3_m4v3(vert->co, curve->mat, svert->co);
+ }
+ }
+
+ return data;
+}
+
+void BKE_strand_data_free(StrandData *data)
+{
+ if (data) {
+ GPU_strands_buffer_free(data);
+
+ if (data->verts)
+ MEM_freeN(data->verts);
+ if (data->curves)
+ MEM_freeN(data->curves);
+ MEM_freeN(data);
+ }
+}
+
+/* ------------------------------------------------------------------------- */
+
void BKE_strands_test_init(struct Strands *strands, struct DerivedMesh *scalp,
int totcurves, int maxverts,
unsigned int seed)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 43ffb59..9d05178 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4313,7 +4313,7 @@ static void direct_link_strands(FileData *fd, Strands *strands)
/* runtime */
strands->gpu_shader = NULL;
- strands->gpu_buffer = NULL;
+ strands->data_final = NULL;
}
/* ************ READ MESH ***************** */
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index accd021..b67eff3 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -74,6 +74,7 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "BKE_strands.h"
#include "BKE_subsurf.h"
#include "BKE_unit.h"
#include "BKE_tracking.h"
@@ -7970,8 +7971,8 @@ 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) {
- draw_strands(smd->strands, ob, rv3d);
+ if (smd->strands && smd->strands->data_final) {
+ draw_strands(smd->strands, smd->strands->data_final, ob, rv3d);
}
}
}
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index 952aef2..c7b2276 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -52,7 +52,7 @@
#include "view3d_intern.h" // own include
-void draw_strands(Strands *strands, Object *ob, RegionView3D *rv3d)
+void draw_strands(Strands *strands, StrandData *data, Object *ob, RegionView3D *rv3d)
{
GPUStrandsShader *gpu_shader = GPU_strand_shader_get(strands);
GPUDrawStrands *gds;
@@ -60,38 +60,12 @@ void draw_strands(Strands *strands, Object *ob, RegionView3D *rv3d)
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;
+ GPU_strands_setup(data);
+ gds = data->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);
-
- const size_t numverts = 4;
- float verts[12] = {
- 0.0f, 0.0f, 0.0f,
- 1.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f,
- 1.0f, 1.0f, 0.0f,
- };
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * numverts, verts, GL_STATIC_DRAW);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, NULL);
-
- glDrawArrays(GL_TRIANGLES, 0, numverts);
-
- glDisableClientState(GL_VERTEX_ARRAY);
-
- /* cleanup */
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glDeleteBuffers(1, &vertex_buffer);
-#endif
-
GPU_strand_shader_unbind(gpu_shader);
}
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index eb1a65c..45e9113 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -47,6 +47,7 @@ struct bMotionPath;
struct bPoseChannel;
struct Mesh;
struct Strands;
+struct StrandData;
struct wmNDOFMotionData;
struct wmOperatorType;
struct wmWindowManager;
@@ -287,7 +288,7 @@ ARegion *view3d_has_tools_region(ScrArea *sa);
extern const char *view3d_context_dir[]; /* doc access */
/* drawstrands.c */
-void draw_strands(struct Strands *strands, struct Object *ob, struct RegionView3D *rv3d);
+void draw_strands(struct Strands *strands, struct StrandData *data, struct Object *ob, struct RegionView3D *rv3d);
/* 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 3f7a3c5..d936570 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -52,7 +52,7 @@ struct GPUDrawObject;
struct GridCommonGPUBuffer;
struct PBVH;
struct MVert;
-struct Strands;
+struct StrandData;
typedef struct GPUBuffer {
size_t size; /* in bytes */
@@ -285,7 +285,7 @@ void GPU_free_pbvh_buffer_multires(struct GridCommonGPUBuffer **grid_common_gpu_
/* strands */
-void GPU_strands_setup(struct Strands *strands);
-void GPU_strands_buffer_free(struct Strands *strands);
+void GPU_strands_setup(struct StrandData *strands);
+void GPU_strands_buffer_free(struct StrandData *strands);
#endif
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index c13e6f5..90930de 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -2121,7 +2121,7 @@ static GPUBuffer **gpu_strands_buffer_from_type(GPUDrawStrands *gds, GPUBufferTy
}
/* get the amount of space to allocate for a buffer of a particular type */
-static size_t gpu_strands_buffer_size_from_type(Strands *strands, GPUBufferType type)
+static size_t gpu_strands_buffer_size_from_type(StrandData *strands, GPUBufferType type)
{
const int components = gpu_buffer_type_settings[type].num_components;
const int totverts = strands->gpu_buffer->totverts;
@@ -2149,7 +2149,7 @@ static size_t gpu_strands_buffer_size_from_type(Strands *strands, GPUBufferType
}
}
-static GPUDrawStrands *strands_buffer_create(Strands *strands)
+static GPUDrawStrands *strands_buffer_create(StrandData *strands)
{
GPUDrawStrands *gsb = MEM_callocN(sizeof(GPUDrawStrands), "GPUStrandsBuffer");
@@ -2159,34 +2159,34 @@ static GPUDrawStrands *strands_buffer_create(Strands *strands)
return gsb;
}
-static void strands_copy_vertex_buffer(Strands *strands, float (*varray)[3])
+static void strands_copy_vertex_buffer(StrandData *strands, float (*varray)[3])
{
int totverts = strands->totverts, v;
- StrandVertex *vert = strands->verts;
+ StrandVertexData *vert = strands->verts;
for (v = 0; v < totverts; ++v, ++vert) {
copy_v3_v3(*varray++, vert->co);
}
}
-static void strands_copy_edge_buffer(Strands *strands, unsigned int (*varray)[2])
+static void strands_copy_edge_buffer(StrandData *strands,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list