Commit: 7e949b3124b4b0c8f32e2f14ae55e80e1d25d03a
Author: Clément Foucault
Date:   Wed Feb 8 00:38:07 2017 +0100
Branches: temp-blender2.8-stable
https://developer.blender.org/rB7e949b3124b4b0c8f32e2f14ae55e80e1d25d03a

OpenGL immediate mode: gluSphere replacement

Updated interface_draw.c to use the new sphere batch.

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

M       source/blender/editors/interface/interface_draw.c
M       source/blender/gpu/GPU_batch.h
M       source/blender/gpu/intern/gpu_batch.c
M       source/blender/gpu/intern/gpu_init_exit.c

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

diff --git a/source/blender/editors/interface/interface_draw.c 
b/source/blender/editors/interface/interface_draw.c
index 1cd1921d12..47497947dc 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -1282,63 +1282,6 @@ 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)
 {
        /* sphere color */
@@ -1357,40 +1300,36 @@ void ui_draw_but_UNITVEC(uiBut *but, uiWidgetColors 
*wcol, const rcti *rect)
        ui_but_v3_get(but, light);
        light[2] = -light[2];
 
-       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 */
        gpuMatrixBegin3D_legacy();
        gpuPushMatrix();
        
        if (BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect))
-               size = BLI_rcti_size_x(rect) / 200.f;
+               size = BLI_rcti_size_x(rect) / 2.f;
        else
-               size = BLI_rcti_size_y(rect) / 200.f;
+               size = BLI_rcti_size_y(rect) / 2.f;
 
        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));
+       gpuScale3f(size, size, size);
 
-       ui_draw_unitvec_sphere(pos, nor, 100.0);
-       immUnbindProgram();
+       Batch *sphere = Batch_get_sphere(2);
+       Batch_set_builtin_program(sphere, GPU_SHADER_SIMPLE_LIGHTING);
+       Batch_Uniform4f(sphere, "color", diffuse[0], diffuse[1], diffuse[2], 
1.f);
+       Batch_Uniform3fv(sphere, "light", light);
+       Batch_draw(sphere);
 
        /* restore */
        glDisable(GL_CULL_FACE);
        
        /* AA circle */
-       format = immVertexFormat();
-       pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+       VertexFormat *format = immVertexFormat();
+       unsigned int 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);
-       imm_draw_lined_circle(pos, 0.0f, 0.0f, 100.0f, 32);
+       imm_draw_lined_circle(pos, 0.0f, 0.0f, 1.0f, 32);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
 
diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h
index bc3017e278..066bc9eeba 100644
--- a/source/blender/gpu/GPU_batch.h
+++ b/source/blender/gpu/GPU_batch.h
@@ -35,3 +35,9 @@
 
 /* Extend Batch_set_program to use Blender’s library of built-in shader 
programs. */
 void Batch_set_builtin_program(Batch*, GPUBuiltinShader);
+
+/* Replacement for gluSphere */
+Batch *Batch_get_sphere(int lod);
+
+void gpu_batch_init(void);
+void gpu_batch_exit(void);
diff --git a/source/blender/gpu/intern/gpu_batch.c 
b/source/blender/gpu/intern/gpu_batch.c
index 23f9f68f1a..716c5e55b3 100644
--- a/source/blender/gpu/intern/gpu_batch.c
+++ b/source/blender/gpu/intern/gpu_batch.c
@@ -25,6 +25,9 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+
 #include "GPU_batch.h"
 #include "gpu_shader_private.h"
 
@@ -33,3 +36,87 @@ void Batch_set_builtin_program(Batch* batch, 
GPUBuiltinShader shader_id)
        GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
        Batch_set_program(batch, shader->program);
 }
+
+static Batch *sphere_high = NULL;
+static Batch *sphere_med = NULL;
+static Batch *sphere_low = NULL;
+
+static VertexBuffer *vbo;
+static VertexFormat format = {0};
+static unsigned int pos_id, nor_id;
+static unsigned int vert;
+
+static void batch_sphere_lat_lon_vert(float lat, float lon)
+{
+       float pos[3];
+       pos[0] = sinf(lat) * cosf(lon);
+       pos[1] = cosf(lat);
+       pos[2] = sinf(lat) * sinf(lon);
+
+       setAttrib(vbo, nor_id, vert, pos);
+       setAttrib(vbo, pos_id, vert++, pos);
+}
+
+/* Replacement for gluSphere */
+static Batch *batch_sphere(int lat_res, int lon_res)
+{
+       const float lon_inc = 2 * M_PI / lon_res;
+       const float lat_inc = M_PI / lat_res;
+       float lon, lat;
+
+       if (format.attrib_ct == 0) {
+               pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
+               nor_id = add_attrib(&format, "nor", GL_FLOAT, 3, KEEP_FLOAT);
+       }
+
+       vbo = VertexBuffer_create_with_format(&format);
+       VertexBuffer_allocate_data(vbo, (lat_res-1) * lon_res * 6);
+       vert = 0;
+
+       lon = 0.0f;
+       for(int i = 0; i < lon_res; i++, lon += lon_inc) {
+               lat = 0.0f;
+               for(int j = 0; j < lat_res; j++, lat += lat_inc) {
+                       if (j != lat_res - 1) { /* Pole */
+                               batch_sphere_lat_lon_vert(lat,         lon);
+                               batch_sphere_lat_lon_vert(lat+lat_inc, lon);
+                               batch_sphere_lat_lon_vert(lat+lat_inc, 
lon+lon_inc);
+                       }
+
+                       if (j != 0) { /* Pole */
+                               batch_sphere_lat_lon_vert(lat,         lon);
+                               batch_sphere_lat_lon_vert(lat+lat_inc, 
lon+lon_inc);
+                               batch_sphere_lat_lon_vert(lat,         
lon+lon_inc);
+                       }
+               }
+       }
+
+       return Batch_create(GL_TRIANGLES, vbo, NULL);
+}
+
+Batch *Batch_get_sphere(int lod)
+{
+       BLI_assert(lod >= 0 && lod <= 2);
+
+       if (lod == 0)
+               return sphere_low;
+       else if (lod == 1)
+               return sphere_med;
+       else
+               return sphere_high;
+}
+
+void gpu_batch_init(void)
+{
+       /* Hard coded resolution */
+       sphere_low = batch_sphere(8, 8);
+       sphere_med = batch_sphere(16, 10);
+       sphere_high = batch_sphere(32, 24);
+}
+
+void gpu_batch_exit(void)
+{
+       Batch_discard_all(sphere_low);
+       Batch_discard_all(sphere_med);
+       Batch_discard_all(sphere_high);
+}
diff --git a/source/blender/gpu/intern/gpu_init_exit.c 
b/source/blender/gpu/intern/gpu_init_exit.c
index 817756a308..7a6b1ff6c7 100644
--- a/source/blender/gpu/intern/gpu_init_exit.c
+++ b/source/blender/gpu/intern/gpu_init_exit.c
@@ -32,6 +32,7 @@
 #include "BLI_sys_types.h"
 #include "GPU_init_exit.h"  /* interface */
 #include "GPU_immediate.h"
+#include "GPU_batch.h"
 #include "BKE_global.h"
 
 #include "intern/gpu_codegen.h"
@@ -59,6 +60,8 @@ void GPU_init(void)
        if (G.debug & G_DEBUG_GPU)
                gpu_debug_init();
 
+       gpu_batch_init();
+
        immInit();
 }
 
@@ -68,6 +71,8 @@ void GPU_exit(void)
 {
        immDestroy();
 
+       gpu_batch_exit();
+
        if (G.debug & G_DEBUG_GPU)
                gpu_debug_exit();

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

Reply via email to