Commit: a39a459a1ecbe3ab0cb772b9eae58ffc0a4d3e08
Author: Clément Foucault
Date:   Tue Feb 7 20:43:58 2017 +0100
Branches: temp-blender2.8-stable
https://developer.blender.org/rBa39a459a1ecbe3ab0cb772b9eae58ffc0a4d3e08

OpenGL immediate mode: interface_draw.c (cont)

ui_draw_but_UNITVEC
Introduced a new shader to be used for simple lighting.

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

M       source/blender/editors/interface/interface_draw.c
M       source/blender/gpu/CMakeLists.txt
M       source/blender/gpu/GPU_shader.h
M       source/blender/gpu/gawain/immediate.c
M       source/blender/gpu/gawain/immediate.h
M       source/blender/gpu/intern/gpu_shader.c
M       source/blender/gpu/shaders/gpu_shader_3D_vert.glsl
A       source/blender/gpu/shaders/gpu_shader_simple_lighting_frag.glsl

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

diff --git a/source/blender/editors/interface/interface_draw.c 
b/source/blender/editors/interface/interface_draw.c
index 7a12be93c7..32df2aaebb 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -1280,81 +1280,123 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors 
*UNUSED(wcol), const rcti
        immUnbindProgram();
 }
 
+#define SPHERE_LAT_RES 24
+#define SPHERE_LON_RES 32
+
+static float sphere_coords[SPHERE_LON_RES][SPHERE_LAT_RES][3] = {{{2.0f}}};
+
+static void ui_draw_lat_lon_vert(unsigned int pos, unsigned int nor, float 
radius, int lat, int lon)
+{
+       const float x = sphere_coords[lon][lat][0];
+       const float y = sphere_coords[lon][lat][1];
+       const float z = sphere_coords[lon][lat][2];
+
+       immAttrib3f(nor, x, y, z);
+       immVertex3f(pos, x * radius, y * radius, z * radius);
+}
+
+static void ui_draw_unitvec_sphere(unsigned int pos, unsigned int nor, float 
radius)
+{
+       const float lon_inc = 2 * M_PI / SPHERE_LON_RES;
+       const float lat_inc = M_PI / SPHERE_LAT_RES;
+       float lon, lat;
+
+       /* TODO put that in a batch */
+
+       /* Init coords only once */
+       if (sphere_coords[0][0][0] == 2.0f) {
+               lon = 0.0f;
+               for(int i = 0; i < SPHERE_LON_RES; i++, lon += lon_inc) {
+                       lat = 0.0f;
+                       for(int j = 0; j < SPHERE_LAT_RES; j++, lat += lat_inc) 
{
+                               sphere_coords[i][j][0] = sinf(lat) * cosf(lon);
+                               sphere_coords[i][j][1] = cosf(lat);
+                               sphere_coords[i][j][2] = sinf(lat) * sinf(lon);
+                       }
+               }
+       }
+
+       immBegin(GL_TRIANGLES, (SPHERE_LAT_RES-1) * SPHERE_LON_RES * 6);
+       for(int i = 0; i < SPHERE_LON_RES; i++) {
+               for(int j = 0; j < SPHERE_LAT_RES; j++) {
+                       if (j != SPHERE_LAT_RES - 1) { /* Pole */
+                               ui_draw_lat_lon_vert(pos, nor, radius, j,   i);
+                               ui_draw_lat_lon_vert(pos, nor, radius, j+1, i);
+                               ui_draw_lat_lon_vert(pos, nor, radius, j+1, 
i+1);
+                       }
+
+                       if (j != 0) { /* Pole */
+                               ui_draw_lat_lon_vert(pos, nor, radius, j,   i);
+                               ui_draw_lat_lon_vert(pos, nor, radius, j+1, 
i+1);
+                               ui_draw_lat_lon_vert(pos, nor, radius, j,   
i+1);
+                       }
+               }
+       }
+       immEnd();
+}
+#undef SPHERE_LAT_RES
+#undef SPHERE_LON_RES
+
 void ui_draw_but_UNITVEC(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
 {
-       static GLuint displist = 0;
+       /* sphere color */
        float diffuse[3] = {1.0f, 1.0f, 1.0f};
+       float light[3];
        float size;
        
        /* backdrop */
        UI_draw_roundbox_corner_set(UI_CNR_ALL);
        UI_draw_roundbox_gl_mode_3ubAlpha(GL_TRIANGLE_FAN, rect->xmin, 
rect->ymin, rect->xmax, rect->ymax, 5.0f, (unsigned char *)wcol->inner, 255);
        
-       /* sphere color */
        glCullFace(GL_BACK);
        glEnable(GL_CULL_FACE);
        
        /* setup lights */
-       GPULightData light = {0};
-       light.type = GPU_LIGHT_SUN;
-       copy_v3_v3(light.diffuse, diffuse);
-       zero_v3(light.specular);
-       ui_but_v3_get(but, light.direction);
+       ui_but_v3_get(but, light);
+       light[2] = -light[2];
 
-       GPU_basic_shader_light_set(0, &light);
-       for (int a = 1; a < 8; a++)
-               GPU_basic_shader_light_set(a, NULL);
-
-       /* setup shader */
-       GPU_basic_shader_colors(diffuse, NULL, 0, 1.0f);
-       GPU_basic_shader_bind(GPU_SHADER_LIGHTING);
+       VertexFormat *format = immVertexFormat();
+       unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+       unsigned int nor = add_attrib(format, "nor", GL_FLOAT, 3, KEEP_FLOAT);
+       immBindBuiltinProgram(GPU_SHADER_SIMPLE_LIGHTING);
+       immUniformColor3fv(diffuse);
+       immUniform3fv("light", light);
 
        /* transform to button */
-       glPushMatrix();
-       glTranslatef(rect->xmin + 0.5f * BLI_rcti_size_x(rect), rect->ymin + 
0.5f * BLI_rcti_size_y(rect), 0.0f);
+       gpuMatrixBegin3D_legacy();
+       gpuPushMatrix();
        
        if (BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect))
                size = BLI_rcti_size_x(rect) / 200.f;
        else
                size = BLI_rcti_size_y(rect) / 200.f;
 
-       glScalef(size, size, MIN2(size, 1.0f));
-
-       if (displist == 0) {
-               GLUquadricObj *qobj;
-
-               displist = glGenLists(1);
-               glNewList(displist, GL_COMPILE);
-               
-               qobj = gluNewQuadric();
-               gluQuadricDrawStyle(qobj, GLU_FILL);
-               GPU_basic_shader_bind(GPU_basic_shader_bound_options());
-               gluSphere(qobj, 100.0, 32, 24);
-               gluDeleteQuadric(qobj);
-               
-               glEndList();
-       }
+       gpuTranslate3f(rect->xmin + 0.5f * BLI_rcti_size_x(rect), rect->ymin + 
0.5f * BLI_rcti_size_y(rect), 0.0f);
+       gpuScale3f(size, size, MIN2(size, 1.0f));
 
-       glCallList(displist);
+       ui_draw_unitvec_sphere(pos, nor, 100.0);
+       immUnbindProgram();
 
        /* restore */
-       GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
-       GPU_default_lights();
        glDisable(GL_CULL_FACE);
        
        /* AA circle */
+       format = immVertexFormat();
+       pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+       immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+       immUniformColor3ubv((unsigned char *)wcol->inner);
+
        glEnable(GL_BLEND);
        glEnable(GL_LINE_SMOOTH);
-       glColor3ubv((unsigned char *)wcol->inner);
-       glutil_draw_lined_arc(0.0f, M_PI * 2.0, 100.0f, 32);
+       imm_draw_lined_circle(pos, 0.0f, 0.0f, 100.0f, 32);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
 
        /* matrix after circle */
-       glPopMatrix();
+       gpuPopMatrix();
+       gpuMatrixEnd();
 
-       /* We disabled all blender lights above, so restore them here. */
-       GPU_default_lights();
+       immUnbindProgram();
 }
 
 static void ui_draw_but_curve_grid(const rcti *rect, float zoomx, float zoomy, 
float offsx, float offsy, float step)
diff --git a/source/blender/gpu/CMakeLists.txt 
b/source/blender/gpu/CMakeLists.txt
index e8d23c7d3f..a2cf143bb0 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -131,6 +131,7 @@ set(SRC
 data_to_c_simple(shaders/gpu_shader_depth_only_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_uniform_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_checker_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_simple_lighting_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_flat_color_alpha_test_0_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_vert.glsl SRC)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 7b9a3e0963..f130dcc8c6 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -97,6 +97,7 @@ typedef enum GPUBuiltinShader {
        GPU_SHADER_EDGES_FRONT_BACK_ORTHO,
        GPU_SHADER_EDGES_OVERLAY_SIMPLE,
        GPU_SHADER_EDGES_OVERLAY,
+       GPU_SHADER_SIMPLE_LIGHTING,
        /* for simple 2D drawing */
        GPU_SHADER_2D_UNIFORM_COLOR,
        GPU_SHADER_2D_FLAT_COLOR,
diff --git a/source/blender/gpu/gawain/immediate.c 
b/source/blender/gpu/gawain/immediate.c
index 03e16ca248..d96fc6f938 100644
--- a/source/blender/gpu/gawain/immediate.c
+++ b/source/blender/gpu/gawain/immediate.c
@@ -727,6 +727,28 @@ void immUniform1f(const char* name, float x)
        glUniform1f(loc, x);
        }
 
+void immUniform3f(const char* name, float x, float y, float z)
+       {
+       int loc = glGetUniformLocation(imm.bound_program, name);
+
+#if TRUST_NO_ONE
+       assert(loc != -1);
+#endif
+
+       glUniform3f(loc, x, y, z);
+       }
+
+void immUniform3fv(const char* name, const float data[3])
+       {
+       int loc = glGetUniformLocation(imm.bound_program, name);
+
+#if TRUST_NO_ONE
+       assert(loc != -1);
+#endif
+
+       glUniform3fv(loc, 1, data);
+       }
+
 void immUniform4f(const char* name, float x, float y, float z, float w)
        {
        int loc = glGetUniformLocation(imm.bound_program, name);
diff --git a/source/blender/gpu/gawain/immediate.h 
b/source/blender/gpu/gawain/immediate.h
index 50965d3d36..d8d6949d47 100644
--- a/source/blender/gpu/gawain/immediate.h
+++ b/source/blender/gpu/gawain/immediate.h
@@ -79,6 +79,8 @@ void immVertex2iv(unsigned attrib_id, const int data[2]);
 // provide uniform values that don't change for the entire draw call
 void immUniform1i(const char* name, int x);
 void immUniform1f(const char* name, float x);
+void immUniform3f(const char* name, float x, float y, float z);
+void immUniform3fv(const char* name, const float data[3]);
 void immUniform4f(const char* name, float x, float y, float z, float w);
 void immUniform4fv(const char* name, const float data[4]);
 
diff --git a/source/blender/gpu/intern/gpu_shader.c 
b/source/blender/gpu/intern/gpu_shader.c
index 5160a33bef..8ff312385c 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -49,6 +49,7 @@
 extern char datatoc_gpu_shader_depth_only_frag_glsl[];
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_checker_frag_glsl[];
+extern char datatoc_gpu_shader_simple_lighting_frag_glsl[];
 extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 extern char datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl[];
 extern char datatoc_gpu_shader_2D_vert_glsl[];
@@ -625,6 +626,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader 
shader)
                [GPU_SHADER_EDGES_OVERLAY] = { 
datatoc_gpu_shader_edges_overlay_vert_glsl,
                                               
datatoc_gpu_shader_edges_overlay_frag_glsl,
                                               
datatoc_gpu_shader_edges_overlay_geom_glsl },
+               [GPU_SHADER_SIMPLE_LIGHTING] = { 
datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_simple_lighting_frag_glsl },
 
                [GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR] = { 
datatoc_gpu_shader_3D_image_vert_glsl,
                                                             
datatoc_gpu_shader_image_mask_uniform_color_frag_glsl },
@@ -686,7 +688,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader 
shader)
 
        if (builtin_shaders[shader] == NULL) {
                /* just a few special cases */
-               const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? 
"#define USE_COBA;\n" : NULL;
+               const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? 
"#define USE_COBA;\n" :
+                                     (shader == GPU_SHADER_SIMPLE_LIGHTING) ? 
"#define USE_NORMALS;\n" : NULL;
 
                const GPUShaderStages *stages = builtin_shader_stages + shader;
 
@@ -698,6 +701,14 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader 
shader)
                        stages = &legacy_fancy_edges;
                }
 
+               if (shader == GPU_SHADER_EDGES_FRONT_BACK_PERSP && 
!GLEW_VERSION_3_2) {
+                       /* TODO: remove after switch to core profile (maybe) */
+                       static const GPUShaderStages legacy_fancy_edges =
+                               { 
datatoc_gpu_shader_edges_front_back_persp_legacy_vert_glsl,
+                                 
datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl };
+                       stag

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to