Commit: 22df54acb62084cf8a8409203e8656f176c28a29
Author: Clément Foucault
Date:   Mon Feb 13 12:41:05 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB22df54acb62084cf8a8409203e8656f176c28a29

OpenGL immediate mode: drawarmature.c (cont)

All (except for stick and wire) are now rendered using batch or immediate API.
Using simple front facing lighting for now, waiting for gpu_basic_shader.c to 
be recoded.

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

M       source/blender/editors/space_view3d/drawarmature.c
M       source/blender/gpu/gawain/batch.c

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

diff --git a/source/blender/editors/space_view3d/drawarmature.c 
b/source/blender/editors/space_view3d/drawarmature.c
index a7bff0a830..1de862b72e 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -64,6 +64,7 @@
 
 #include "GPU_basic_shader.h"
 #include "GPU_batch.h"
+#include "GPU_immediate.h"
 #include "GPU_matrix.h"
 
 #include "UI_resources.h"
@@ -77,6 +78,7 @@
 /* global here is reset before drawing each bone */
 static ThemeWireColor *bcolor = NULL;
 static float fcolor[4] = {0.0f};
+static bool flat_color;
 
 /* values of colCode for set_pchan_glcolor */
 enum {
@@ -355,6 +357,17 @@ static void set_ebone_glColor(const unsigned int boneflag)
 
 /* *************** Armature drawing, helper calls for parts 
******************* */
 
+static void add_solid_flat_triangle(VertexBuffer *vbo, unsigned int *vertex, 
unsigned int pos, unsigned int nor,
+                                    const float p1[3], const float p2[3], 
const float p3[3], const float n[3])
+{
+       setAttrib(vbo, nor, *vertex, n);
+       setAttrib(vbo, pos, (*vertex)++, p1);
+       setAttrib(vbo, nor, *vertex, n);
+       setAttrib(vbo, pos, (*vertex)++, p2);
+       setAttrib(vbo, nor, *vertex, n);
+       setAttrib(vbo, pos, (*vertex)++, p3);
+}
+
 /* half the cube, in Y */
 static const float cube_vert[8][3] = {
        {-1.0,  0.0, -1.0},
@@ -375,44 +388,63 @@ static const float cube_wire[24] = {
 
 static void drawsolidcube_size(float xsize, float ysize, float zsize)
 {
-       static GLuint displist = 0;
-       float n[3] = {0.0f};
-       
-       glScalef(xsize, ysize, zsize);
+       static VertexFormat format = {0};
+       static VertexBuffer vbo = {0};
+       static Batch batch = {0};
+       const float light_vec[3] = {0.0f, 0.0f, 1.0f};
+
+       if (format.attrib_ct == 0) {
+               unsigned int i = 0;
+               float n[3] = {0.0f};
+               /* Vertex format */
+               unsigned int pos = add_attrib(&format, "pos", GL_FLOAT, 3, 
KEEP_FLOAT);
+               unsigned int nor = add_attrib(&format, "nor", GL_FLOAT, 3, 
KEEP_FLOAT);
 
-       if (displist == 0) {
-               displist = glGenLists(1);
-               glNewList(displist, GL_COMPILE);
+               /* Vertices */
+               VertexBuffer_init_with_format(&vbo, &format);
+               VertexBuffer_allocate_data(&vbo, 36);
 
-               glBegin(GL_QUADS);
                n[0] = -1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[0]); glVertex3fv(cube_vert[1]); 
glVertex3fv(cube_vert[2]); glVertex3fv(cube_vert[3]);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[0], 
cube_vert[1], cube_vert[2], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[2], 
cube_vert[3], cube_vert[0], n);
                n[0] = 0;
                n[1] = -1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[0]); glVertex3fv(cube_vert[4]); 
glVertex3fv(cube_vert[5]); glVertex3fv(cube_vert[1]);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[0], 
cube_vert[4], cube_vert[5], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[5], 
cube_vert[1], cube_vert[0], n);
                n[1] = 0;
                n[0] = 1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[4]); glVertex3fv(cube_vert[7]); 
glVertex3fv(cube_vert[6]); glVertex3fv(cube_vert[5]);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[4], 
cube_vert[7], cube_vert[6], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[6], 
cube_vert[5], cube_vert[4], n);
                n[0] = 0;
                n[1] = 1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[7]); glVertex3fv(cube_vert[3]); 
glVertex3fv(cube_vert[2]); glVertex3fv(cube_vert[6]);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[7], 
cube_vert[3], cube_vert[2], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[2], 
cube_vert[6], cube_vert[7], n);
                n[1] = 0;
                n[2] = 1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[1]); glVertex3fv(cube_vert[5]); 
glVertex3fv(cube_vert[6]); glVertex3fv(cube_vert[2]);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[1], 
cube_vert[5], cube_vert[6], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[6], 
cube_vert[2], cube_vert[1], n);
                n[2] = -1.0;
-               glNormal3fv(n); 
-               glVertex3fv(cube_vert[7]); glVertex3fv(cube_vert[4]); 
glVertex3fv(cube_vert[0]); glVertex3fv(cube_vert[3]);
-               glEnd();
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[7], 
cube_vert[4], cube_vert[0], n);
+               add_solid_flat_triangle(&vbo, &i, pos, nor, cube_vert[0], 
cube_vert[3], cube_vert[7], n);
 
-               glEndList();
+               Batch_init(&batch, GL_TRIANGLES, &vbo, NULL);
+       }
+
+       gpuMatrixBegin3D_legacy();
+       gpuScale3f(xsize, ysize, zsize);
+
+       if (flat_color) {
+               Batch_set_builtin_program(&batch, GPU_SHADER_3D_UNIFORM_COLOR);
+       }
+       else {
+               /* TODO replace with good default lighting shader ? */
+               Batch_set_builtin_program(&batch, GPU_SHADER_SIMPLE_LIGHTING);
+               Batch_Uniform3fv(&batch, "light", light_vec);
        }
+       Batch_Uniform4fv(&batch, "color", fcolor);
+       Batch_draw(&batch);
 
-       glCallList(displist);
+       gpuMatrixEnd();
 }
 
 static void drawcube_size(float xsize, float ysize, float zsize)
@@ -458,55 +490,79 @@ static void drawcube_size(float xsize, float ysize, float 
zsize)
 
 static void draw_bonevert(void)
 {
-       static GLuint displist = 0;
-       
-       if (displist == 0) {
-               GLUquadricObj   *qobj;
-               
-               displist = glGenLists(1);
-               glNewList(displist, GL_COMPILE);
-                       
-               glPushMatrix();
-               
-               qobj    = gluNewQuadric();
-               gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); 
-               gluDisk(qobj, 0.0,  0.05, 16, 1);
-               
-               glRotatef(90, 0, 1, 0);
-               gluDisk(qobj, 0.0,  0.05, 16, 1);
-               
-               glRotatef(90, 1, 0, 0);
-               gluDisk(qobj, 0.0,  0.05, 16, 1);
-               
-               gluDeleteQuadric(qobj);  
-               
-               glPopMatrix();
-               glEndList();
+       static VertexFormat format = {0};
+       static VertexBuffer vbo = {0};
+       static Batch batch = {0};
+
+       if (format.attrib_ct == 0) {
+               /* Vertex format */
+               unsigned int pos = add_attrib(&format, "pos", GL_FLOAT, 3, 
KEEP_FLOAT);
+
+               /* Vertices */
+               VertexBuffer_init_with_format(&vbo, &format);
+               VertexBuffer_allocate_data(&vbo, 96);
+               for (int i = 0; i < 16; ++i) {
+                       float vert[3] = {0.f, 0.f, 0.f};
+                       const float r = 0.05f;
+
+                       vert[0] = r * cosf(2 * M_PI * i / 16.f);
+                       vert[1] = r * sinf(2 * M_PI * i / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 0, vert);
+                       vert[0] = r * cosf(2 * M_PI * (i + 1) / 16.f);
+                       vert[1] = r * sinf(2 * M_PI * (i + 1) / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 1, vert);
+
+                       vert[0] = 0.f;
+                       vert[1] = r * cosf(2 * M_PI * i / 16.f);
+                       vert[2] = r * sinf(2 * M_PI * i / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 2, vert);
+                       vert[1] = r * cosf(2 * M_PI * (i + 1) / 16.f);
+                       vert[2] = r * sinf(2 * M_PI * (i + 1) / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 3, vert);
+
+                       vert[1] = 0.f;
+                       vert[0] = r * cosf(2 * M_PI * i / 16.f);
+                       vert[2] = r * sinf(2 * M_PI * i / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 4, vert);
+                       vert[0] = r * cosf(2 * M_PI * (i + 1) / 16.f);
+                       vert[2] = r * sinf(2 * M_PI * (i + 1) / 16.f);
+                       setAttrib(&vbo, pos, i * 6 + 5, vert);
+               }
+
+               Batch_init(&batch, GL_LINES, &vbo, NULL);
+               Batch_set_builtin_program(&batch, GPU_SHADER_3D_UNIFORM_COLOR);
        }
 
-       glCallList(displist);
+       gpuMatrixBegin3D_legacy();
+
+       Batch_use_program(&batch);
+       Batch_Uniform4fv(&batch, "color", fcolor);
+       Batch_draw(&batch);
+
+       gpuMatrixEnd();
 }
 
 static void draw_bonevert_solid(void)
 {
-       static GLuint displist = 0;
-       
-       if (displist == 0) {
-               GLUquadricObj *qobj;
-               
-               displist = glGenLists(1);
-               glNewList(displist, GL_COMPILE);
-               
-               qobj = gluNewQuadric();
-               gluQuadricDrawStyle(qobj, GLU_FILL);
-               /* Draw tips of a bone */
-               gluSphere(qobj, 0.05, 8, 5);
-               gluDeleteQuadric(qobj);  
-               
-               glEndList();
+       Batch *batch = Batch_get_sphere(0);
+       const float light_vec[3] = {0.0f, 0.0f, 1.0f};
+
+       gpuMatrixBegin3D_legacy();
+
+       gpuScale3f(0.05, 0.05, 0.05);
+
+       if (flat_color) {
+               Batch_set_builtin_program(batch, GPU_SHADER_3D_UNIFORM_COLOR);
        }
+       else {
+               /* TODO replace with good default lighting shader ? */
+               Batch_set_builtin_program(batch, GPU_SHADER_SIMPLE_LIGHTING);
+               Batch_Uniform3fv(batch, "light", light_vec);
+       }
+       Batch_Uniform4fv(batch, "color", fcolor);
+       Batch_draw(batch);
 
-       glCallList(displist);
+       gpuMatrixEnd();
 }
 
 static const float bone_octahedral_verts[6][3] = {
@@ -589,40 +645,46 @@ static void draw_bone_octahedral(void)
 
 static void draw_bone_solid_octahedral(void)
 {
-       static GLuint displist = 0;
-
-       if (displist == 0) {
-               int i;
+       static VertexFormat format = {0};
+       static VertexBuffer vbo = {0};
+       static Batch batch = {0};
+       const float light_vec[3] = {0.0f, 0.0f, 1.0f};
 
-               displist = glGenLists(1);
-               glNewList(displist, GL_COMPILE);
+       if (format.attrib_ct == 0) {
+               unsigned int v_idx = 0;
+               /* Vertex format */
+               unsigned int pos = add_attrib(&format, "pos", GL_FLOAT, 3, 
KEEP_FLOAT);
+               unsigned int nor = add_attrib(&format, "nor", GL_FLOAT, 3, 
KEEP_FLOAT);
 
-#if 1
-               glBegin(GL_TRIANGLES);
-               for (i = 0; i < 8; i++) {
-                       glNormal3fv(bone_octahedral_solid_normals[i]);
-                       
glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][0]]);
-                       
glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][1]]);
-                       
glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][2]]);
+               /* Vertices */
+               VertexBuffer_init_with_format(&vbo, &format);
+               VertexBuffer_allocate_data(&vbo, 24);
+
+               for (int i = 0; i < 8; i++) {
+                       add_solid_flat_triangle(&vbo, &v_idx, pos, nor,
+                                               
bone_octahedral_verts[bone_octahedral_solid_tris[i][0]],
+                                               
bone_octahedral_verts[bone_octahedral_solid_tris[i][1]],
+                                               
bone_octahedral_verts[bone_octahedral_solid_tris[i][2]],
+                                               
bone_octahedral_solid_normals[i]);
                }
 
-               glEnd();
+               Batch_init(&batch, GL_TRIANGLES, &vbo, NULL);
+       }
 
-#else   /* not working because each vert needs a different normal */
-               glEnableClientState(GL_NORMAL_ARRAY);
-               glEnableClientState(GL_VERTEX_ARRAY);
-               glNormalPointer(GL_FLOAT, 0, bone_octahedral_solid_normals);
-               glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts);
-               glDrawElements(GL_TRIANGLES, sizeof(bone_octahedral_solid_tris) 
/ sizeof(unsigned int),
-                              GL_UNSIGNED_INT, bone_octahedral_solid_tris);
-               glDisableClientState(GL_NORMAL_ARRAY);
-               glDisableClientState(GL_VERTEX_ARRAY);
-#endif
+       gpuMatrixBegin3D_legacy();
 
-               glEndList();
+       if (flat_color) {
+               Batch_set_builtin_program(&ba

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to