[Bf-blender-cvs] [747ac66800] blender2.8: Clay Engine: More Lamp drawing work
Clément Foucault
noreply at git.blender.org
Sun Mar 5 18:06:42 CET 2017
Commit: 747ac668002497e4b2ca801c7629f27e0473f261
Author: Clément Foucault
Date: Sun Mar 5 05:22:40 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB747ac668002497e4b2ca801c7629f27e0473f261
Clay Engine: More Lamp drawing work
===================================================================
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_mode_pass.c
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_shader.h
M source/blender/gpu/intern/gpu_shader.c
A source/blender/gpu/shaders/gpu_shader_instance_edges_variying_color_geom.glsl
A source/blender/gpu/shaders/gpu_shader_instance_edges_variying_color_vert.glsl
M source/blender/makesdna/DNA_lamp_types.h
===================================================================
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 399ed1032c..7514a0c806 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -44,6 +44,7 @@ static struct DRWShapeCache {
Batch *drw_single_arrow;
Batch *drw_cube;
Batch *drw_circle;
+ Batch *drw_square;
Batch *drw_line;
Batch *drw_line_endpoints;
Batch *drw_empty_sphere;
@@ -52,6 +53,10 @@ static struct DRWShapeCache {
Batch *drw_axis_names;
Batch *drw_lamp;
Batch *drw_lamp_sunrays;
+ Batch *drw_lamp_area;
+ Batch *drw_lamp_hemi;
+ Batch *drw_lamp_spot;
+ Batch *drw_lamp_spot_square;
Batch *drw_speaker;
Batch *drw_bone_octahedral;
Batch *drw_bone_octahedral_wire;
@@ -77,6 +82,8 @@ void DRW_shape_cache_free(void)
Batch_discard_all(SHC.drw_cube);
if (SHC.drw_circle)
Batch_discard_all(SHC.drw_circle);
+ if (SHC.drw_square)
+ Batch_discard_all(SHC.drw_square);
if (SHC.drw_line)
Batch_discard_all(SHC.drw_line);
if (SHC.drw_line_endpoints)
@@ -93,6 +100,14 @@ void DRW_shape_cache_free(void)
Batch_discard_all(SHC.drw_lamp);
if (SHC.drw_lamp_sunrays)
Batch_discard_all(SHC.drw_lamp_sunrays);
+ if (SHC.drw_lamp_area)
+ Batch_discard_all(SHC.drw_lamp_area);
+ if (SHC.drw_lamp_hemi)
+ Batch_discard_all(SHC.drw_lamp_hemi);
+ if (SHC.drw_lamp_spot)
+ Batch_discard_all(SHC.drw_lamp_spot);
+ if (SHC.drw_lamp_spot_square)
+ Batch_discard_all(SHC.drw_lamp_spot_square);
if (SHC.drw_speaker)
Batch_discard_all(SHC.drw_speaker);
if (SHC.drw_bone_octahedral)
@@ -335,6 +350,34 @@ Batch *DRW_cache_circle_get(void)
#undef CIRCLE_RESOL
}
+Batch *DRW_cache_square_get(void)
+{
+ if (!SHC.drw_square) {
+ float p[4][3] = {{ 1.0f, 0.0f, 1.0f},
+ { 1.0f, 0.0f, -1.0f},
+ {-1.0f, 0.0f, -1.0f},
+ {-1.0f, 0.0f, 1.0f}};
+
+ /* Position Only 3D format */
+ static VertexFormat format = { 0 };
+ static unsigned pos_id;
+ if (format.attrib_ct == 0) {
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, 8);
+
+ for (int i = 0; i < 4; i++) {
+ setAttrib(vbo, pos_id, i * 2, p[i % 4]);
+ setAttrib(vbo, pos_id, i * 2 + 1, p[(i+1) % 4]);
+ }
+
+ SHC.drw_square = Batch_create(GL_LINES, vbo, NULL);
+ }
+ return SHC.drw_square;
+}
+
Batch *DRW_cache_single_line_get(void)
{
/* Z axis line */
@@ -652,6 +695,208 @@ Batch *DRW_cache_lamp_sunrays_get(void)
return SHC.drw_lamp_sunrays;
}
+Batch *DRW_cache_lamp_area_get(void)
+{
+ if (!SHC.drw_lamp_area) {
+ float v1[3] = {0.0f, 0.0f, 0.0f};
+
+ /* Position Only 3D format */
+ static VertexFormat format = { 0 };
+ static unsigned pos_id;
+ if (format.attrib_ct == 0) {
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, 8);
+
+ v1[0] = v1[1] = 0.5f;
+ setAttrib(vbo, pos_id, 0, v1);
+ v1[0] = -0.5f;
+ setAttrib(vbo, pos_id, 1, v1);
+ setAttrib(vbo, pos_id, 2, v1);
+ v1[1] = -0.5f;
+ setAttrib(vbo, pos_id, 3, v1);
+ setAttrib(vbo, pos_id, 4, v1);
+ v1[0] = 0.5f;
+ setAttrib(vbo, pos_id, 5, v1);
+ setAttrib(vbo, pos_id, 6, v1);
+ v1[1] = 0.5f;
+ setAttrib(vbo, pos_id, 7, v1);
+
+ SHC.drw_lamp_area = Batch_create(GL_LINES, vbo, NULL);
+ }
+ return SHC.drw_lamp_area;
+}
+
+Batch *DRW_cache_lamp_hemi_get(void)
+{
+#define CIRCLE_RESOL 32
+ if (!SHC.drw_lamp_hemi) {
+ float v[3];
+ int vidx = 0;
+
+ /* Position Only 3D format */
+ static VertexFormat format = { 0 };
+ static unsigned pos_id;
+ if (format.attrib_ct == 0) {
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, CIRCLE_RESOL * 2 * 2 - 6 * 2 * 2);
+
+ /* XZ plane */
+ for (int a = 3; a < CIRCLE_RESOL / 2 - 3; a++) {
+ v[0] = sinf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL) - M_PI / 2);
+ v[2] = cosf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL) - M_PI / 2) - 1.0f;
+ v[1] = 0.0f;
+ setAttrib(vbo, pos_id, vidx++, v);
+
+ v[0] = sinf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL) - M_PI / 2);
+ v[2] = cosf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL) - M_PI / 2) - 1.0f;
+ v[1] = 0.0f;
+ setAttrib(vbo, pos_id, vidx++, v);
+ }
+
+ /* XY plane */
+ for (int a = 3; a < CIRCLE_RESOL / 2 - 3; a++) {
+ v[2] = sinf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL)) - 1.0f;
+ v[1] = cosf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL));
+ v[0] = 0.0f;
+ setAttrib(vbo, pos_id, vidx++, v);
+
+ v[2] = sinf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL)) - 1.0f;
+ v[1] = cosf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL));
+ v[0] = 0.0f;
+ setAttrib(vbo, pos_id, vidx++, v);
+ }
+
+ /* YZ plane full circle */
+ /* lease v[2] as it is */
+ const float rad = cosf((2.0f * M_PI * 3) / ((float)CIRCLE_RESOL));
+ for (int a = 0; a < CIRCLE_RESOL; a++) {
+ v[1] = rad * sinf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL));
+ v[0] = rad * cosf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL));
+ setAttrib(vbo, pos_id, vidx++, v);
+
+ v[1] = rad * sinf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL));
+ v[0] = rad * cosf((2.0f * M_PI * (a + 1)) / ((float)CIRCLE_RESOL));
+ setAttrib(vbo, pos_id, vidx++, v);
+ }
+
+
+ SHC.drw_lamp_hemi = Batch_create(GL_LINES, vbo, NULL);
+ }
+ return SHC.drw_lamp_hemi;
+#undef CIRCLE_RESOL
+}
+
+
+Batch *DRW_cache_lamp_spot_get(void)
+{
+#define NSEGMENTS 32
+ if (!SHC.drw_lamp_spot) {
+ /* a single ring of vertices */
+ float p[NSEGMENTS][2];
+ float n[NSEGMENTS][3];
+ float neg[NSEGMENTS][3];
+ float half_angle = 2 * M_PI / ((float)NSEGMENTS * 2);
+ for (int i = 0; i < NSEGMENTS; ++i) {
+ float angle = 2 * M_PI * ((float)i / (float)NSEGMENTS);
+ p[i][0] = cosf(angle);
+ p[i][1] = sinf(angle);
+
+ n[i][0] = cosf(angle - half_angle);
+ n[i][1] = sinf(angle - half_angle);
+ n[i][2] = cosf(M_PI / 16.0f); /* slope of the cone */
+ normalize_v3(n[i]); /* necessary ? */
+ negate_v3_v3(neg[i], n[i]);
+ }
+
+ /* Position Only 3D format */
+ static VertexFormat format = { 0 };
+ static unsigned int pos_id, n1_id, n2_id;
+ if (format.attrib_ct == 0) {
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ n1_id = add_attrib(&format, "N1", GL_FLOAT, 3, KEEP_FLOAT);
+ n2_id = add_attrib(&format, "N2", GL_FLOAT, 3, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, NSEGMENTS * 4);
+
+ for (int i = 0; i < NSEGMENTS; ++i) {
+ float cv[2], v[3];
+ cv[0] = p[i % NSEGMENTS][0];
+ cv[1] = p[i % NSEGMENTS][1];
+
+ /* cone sides */
+ v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ setAttrib(vbo, pos_id, i * 4, v);
+ v[0] = 0.0f, v[1] = 0.0f, v[2] = 0.0f;
+ setAttrib(vbo, pos_id, i * 4 + 1, v);
+
+ setAttrib(vbo, n1_id, i * 4, n[(i) % NSEGMENTS]);
+ setAttrib(vbo, n1_id, i * 4 + 1, n[(i) % NSEGMENTS]);
+ setAttrib(vbo, n2_id, i * 4, n[(i+1) % NSEGMENTS]);
+ setAttrib(vbo, n2_id, i * 4 + 1, n[(i+1) % NSEGMENTS]);
+
+ /* end ring */
+ v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ setAttrib(vbo, pos_id, i * 4 + 2, v);
+ cv[0] = p[(i + 1) % NSEGMENTS][0];
+ cv[1] = p[(i + 1) % NSEGMENTS][1];
+ v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ setAttrib(vbo, pos_id, i * 4 + 3, v);
+
+ setAttrib(vbo, n1_id, i * 4 + 2, n[(i) % NSEGMENTS]);
+ setAttrib(vbo, n1_id, i * 4 + 3, n[(i) % NSEGMENTS]);
+ setAttrib(vbo, n2_id, i * 4 + 2, neg[(i) % NSEGMENTS]);
+ setAttrib(vbo, n2_id, i * 4 + 3, neg[(i) % NSEGMENTS]);
+ }
+
+ SHC.drw_lamp_spot = Batch_create(GL_LINES, vbo, NULL);
+ }
+ return SHC.drw_lamp_spot;
+#undef NSEGMENTS
+}
+
+Batch *DRW_cache_lamp_spot_square_get(void)
+{
+ if (!SHC.drw_lamp_spot_square) {
+ float p[5][3] = {{ 0.0f, 0.0f, 0.0f},
+ { 1.0f, 1.0f, -1.0f},
+ { 1.0f, -1.0f, -1.0f},
+ {-1.0f, -1.0f, -1.0f},
+ {-1.0f, 1.0f, -1.0f}};
+
+ unsigned int v_idx = 0;
+
+ /* Position Only 3D format */
+ static VertexFormat format = { 0 };
+ static unsigned int pos_id;
+ if (format.attrib_ct == 0) {
+ pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+ }
+
+ VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+ VertexBuffer_allocate_data(vbo, 16);
+
+ /* piramid sides */
+ for (int i = 1; i <= 4; ++i) {
+ setAttrib(vbo, pos_id, v_idx++, p[0]);
+ setAttrib(vbo, pos_id, v_idx++, p[i]);
+
+ setAttrib(vbo, pos_id, v_idx++, p[(i % 4)+1]);
+ setAttrib(vbo, pos_id, v_idx++, p[((i+1) % 4)+1]);
+ }
+
+ SHC.drw_lamp_spot_square = Batch_create(GL_LINES, vbo, NULL);
+ }
+ return SHC.drw_lamp_spot_square;
+}
+
/* Speaker */
Batch *DRW_cache_speaker_get(void)
{
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index bfab441bee..66aa5400df 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -42,6 +42,7 @@ struct Batch *DRW_cache_plain_axes_get(void);
struct Batch *DRW_cache_single_arrow_get(void);
struct Batch *DRW_cache_cube_get(void);
struct Batch *DRW_cache_circle_get(void);
+struct Batch *DRW_cache_square_get(void);
struct Batch *DRW_cache_empty_sphere_get(void);
struct Batch *DRW_cache_empty_cone_get(void);
struct Batch *DRW_cache_arrows_get(void);
@@ -50,6 +51,10 @@ struct Batch *DRW_cache_axis_names_get(void);
/* Lamps */
struct Batch *DRW_cache_lamp_get(void);
struct Batch *DRW_cache_lamp_sunrays_get(void);
+struct Batch *DRW_cache_lamp_area_get(void);
+struct Batch *DRW_cache_lamp_hemi_get(void);
+struct Batch *DRW_cache_lamp_spot_get(void);
+struct Batch *DRW_cache_lamp_spot_square_get(void);
/* Camera */
struct Batch *DRW_cache_camera_get(void);
diff --git a/source/blender/draw/intern/draw_mode_pass.c b/source/blender/draw/intern/draw_mode_pass.c
index a066f8ce4f..b21e6a23b7 100644
--- a/source/blender/draw/intern/draw_mode_pass.c
+++ b/source/blender/draw/intern/draw_mode_pass.c
@@ -65,6 +65,15 @@ static DRWShadingGroup *lamp_groundline;
stati
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list