[Bf-blender-cvs] [22df54acb6] blender2.8: OpenGL immediate mode: drawarmature.c (cont)

Clément Foucault noreply at git.blender.org
Tue Feb 14 00:54:03 CET 2017


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. @@




More information about the Bf-blender-cvs mailing list