[Bf-blender-cvs] [9c35907ca2] blender2.8: OpenGL immediate mode: Replacement for gluCylinder

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


Commit: 9c35907ca2c7963d722de469e9116350da70b71b
Author: Clément Foucault
Date:   Sun Feb 12 19:19:35 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB9c35907ca2c7963d722de469e9116350da70b71b

OpenGL immediate mode: Replacement for gluCylinder

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

M	source/blender/editors/include/BIF_glutil.h
M	source/blender/editors/screen/glutil.c

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

diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index d0bd951344..0355925f83 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -138,6 +138,20 @@ void imm_draw_line(unsigned pos, float x1, float y1, float x2, float y2);
 void imm_cpack(unsigned int x);
 
 /**
+* Draw a cylinder. Replacement for gluCylinder.
+* _warning_ : Slow, better use it only if you no other choices.
+*
+* \param pos The vertex attribute number for position.
+* \param nor The vertex attribute number for normal.
+* \param base Specifies the radius of the cylinder at z = 0.
+* \param top Specifies the radius of the cylinder at z = height.
+* \param height Specifies the height of the cylinder.
+* \param slices Specifies the number of subdivisions around the z axis.
+* \param stacks Specifies the number of subdivisions along the z axis.
+*/
+void imm_cylinder(unsigned int pos, unsigned int nor, float base, float top, float height, int slices, int stacks);
+
+/**
  * Returns a float value as obtained by glGetFloatv.
  * The param must cause only one value to be gotten from GL.
  */
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index dde4762676..4a8edef4ca 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -251,6 +251,57 @@ void imm_cpack(unsigned int x)
 		(((x) >> 16) & 0xFF));
 }
 
+void imm_cylinder(unsigned int pos, unsigned int nor, float base, float top, float height, int slices, int stacks)
+{
+	immBegin(GL_TRIANGLES, 6 * slices * stacks);
+	for (int i = 0; i < slices; ++i) {
+		const float angle1 = 2 * M_PI * ((float)i / (float)slices);
+		const float angle2 = 2 * M_PI * ((float)(i+1) / (float)slices);
+		const float cos1 = cosf(angle1);
+		const float sin1 = sinf(angle1);
+		const float cos2 = cosf(angle2);
+		const float sin2 = sinf(angle2);
+
+		for (int j = 0; j < stacks; ++j) {
+			float fac1 = (float)j / (float)stacks;
+			float fac2 = (float)(j+1) / (float)stacks;
+			float r1 = base * (1.f - fac1) + top * fac1;
+			float r2 = base * (1.f - fac2) + top * fac2;
+			float h1 = height * ((float)j / (float)stacks);
+			float h2 = height * ((float)(j+1) / (float)stacks);
+
+			float v1[3] = {r1 * cos2, r1 * sin2, h1};
+			float v2[3] = {r2 * cos2, r2 * sin2, h2};
+			float v3[3] = {r2 * cos1, r2 * sin1, h2};
+			float v4[3] = {r1 * cos1, r1 * sin1, h1};
+			float n1[3], n2[3];
+
+			/* calc normals */
+			sub_v3_v3v3(n1, v2, v1);
+			normalize_v3(n1);
+			n1[0] = cos1; n1[1] = sin1; n1[2] = 1-n1[2];
+
+			sub_v3_v3v3(n2, v3, v4);
+			normalize_v3(n2);
+			n2[0] = cos2; n2[1] = sin2; n2[2] = 1-n2[2];
+
+			/* first tri */
+			immAttrib3fv(nor, n2);
+			immVertex3fv(pos, v1);
+			immVertex3fv(pos, v2);
+			immAttrib3fv(nor, n1);
+			immVertex3fv(pos, v3);
+
+			/* second tri */
+			immVertex3fv(pos, v3);
+			immVertex3fv(pos, v4);
+			immAttrib3fv(nor, n2);
+			immVertex3fv(pos, v1);
+		}
+	}
+	immEnd();
+}
+
 float glaGetOneFloat(int param)
 {
 	GLfloat v;




More information about the Bf-blender-cvs mailing list