[Bf-blender-cvs] [237d7f3] wiggly-widgets: Complete shaded arrow widget code. It will need sorting if keep the shading.
Antony Riakiotakis
noreply at git.blender.org
Tue Oct 7 20:31:36 CEST 2014
Commit: 237d7f3188f7d02e8cbaba2ab23a2ea62aee6516
Author: Antony Riakiotakis
Date: Tue Oct 7 20:29:40 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB237d7f3188f7d02e8cbaba2ab23a2ea62aee6516
Complete shaded arrow widget code. It will need sorting if keep the
shading.
===================================================================
M source/blender/editors/interface/interface_generic_widgets.c
===================================================================
diff --git a/source/blender/editors/interface/interface_generic_widgets.c b/source/blender/editors/interface/interface_generic_widgets.c
index e0d82c4..5a87c7a 100644
--- a/source/blender/editors/interface/interface_generic_widgets.c
+++ b/source/blender/editors/interface/interface_generic_widgets.c
@@ -338,22 +338,25 @@ typedef struct ArrowWidget {
} ArrowWidget;
#define ARROW_RESOLUTION 16
-#define NUMVERTS (ARROW_RESOLUTION * 5 + 4)
+#define POLE_POINTS 3
+#define NUMVERTS (ARROW_RESOLUTION * 5 + POLE_POINTS)
+#define NUM_INDICES (5 * ARROW_RESOLUTION + 8)
static void widget_draw_intern(bool select, bool highlight)
{
GLuint buf[3];
static float verts[NUMVERTS][3];
static float normals[NUMVERTS][3];
- static unsigned short indices[2*ARROW_RESOLUTION + 4];
+ static unsigned short indices[NUM_INDICES];
static bool gen = false;
if (!gen) {
- int i;
+ int i, j;
float height = 1.0;
- float width = 1.0;
+ float width = 0.4;
float angle_inclination = atan2(height, width);
float incl_cos = cos(angle_inclination);
float incl_sin = sin(angle_inclination);
+ int offset = 0;
verts[0][0] = 0.0f;
verts[0][1] = 0.0f;
@@ -370,35 +373,82 @@ static void widget_draw_intern(bool select, bool highlight)
normals[1][0] = 0.0f;
normals[1][1] = 0.0f;
normals[1][2] = -1.0f;
+
+ verts[2][0] = 0.0f;
+ verts[2][1] = 0.0f;
+ verts[2][2] = -2.0f;
+
+ normals[2][0] = 0.0f;
+ normals[2][1] = 0.0f;
+ normals[2][2] = -1.0f;
for (i = 0; i < ARROW_RESOLUTION; i++) {
float angle = 2.0f * M_PI * i / ARROW_RESOLUTION;
- verts[2 + i][0] = width * cos (angle);
- verts[2 + i][1] = width * sin (angle);
- verts[2 + i][2] = 0.0f;
+ verts[POLE_POINTS + i][0] = width * cos (angle);
+ verts[POLE_POINTS + i][1] = width * sin (angle);
+ verts[POLE_POINTS + i][2] = 0.0f;
+
+ normals[POLE_POINTS + i][0] = incl_cos * cos(angle);
+ normals[POLE_POINTS + i][1] = incl_cos * sin(angle);
+ normals[POLE_POINTS + i][2] = incl_sin;
+
+ verts[POLE_POINTS + i + ARROW_RESOLUTION][0] = width * cos (angle);
+ verts[POLE_POINTS + i + ARROW_RESOLUTION][1] = width * sin (angle);
+ verts[POLE_POINTS + i + ARROW_RESOLUTION][2] = 0.0f;
- normals[2 + i][0] = incl_cos * cos(angle);
- normals[2 + i][1] = incl_cos * sin(angle);
- normals[2 + i][2] = incl_sin;
+ normals[POLE_POINTS + i + ARROW_RESOLUTION][0] = 0.0f;
+ normals[POLE_POINTS + i + ARROW_RESOLUTION][1] = 0.0f;
+ normals[POLE_POINTS + i + ARROW_RESOLUTION][2] = -1.0f;
+
+ verts[POLE_POINTS + i + 2 * ARROW_RESOLUTION][0] = 0.25 * width * cos (angle);
+ verts[POLE_POINTS + i + 2 * ARROW_RESOLUTION][1] = 0.25 * width * sin (angle);
+ verts[POLE_POINTS + i + 2 * ARROW_RESOLUTION][2] = 0.0f;
+
+ normals[POLE_POINTS + i + 2 * ARROW_RESOLUTION][0] = cos(angle);
+ normals[POLE_POINTS + i + 2 * ARROW_RESOLUTION][1] = sin(angle);
+ normals[POLE_POINTS + i + 2 * ARROW_RESOLUTION][2] = 0.0f;
- verts[2 + i + ARROW_RESOLUTION][0] = width * cos (angle);
- verts[2 + i + ARROW_RESOLUTION][1] = width * sin (angle);
- verts[2 + i + ARROW_RESOLUTION][2] = 0.0f;
+ verts[POLE_POINTS + i + 3 * ARROW_RESOLUTION][0] = 0.25 * width * cos (angle);
+ verts[POLE_POINTS + i + 3 * ARROW_RESOLUTION][1] = 0.25 * width * sin (angle);
+ verts[POLE_POINTS + i + 3 * ARROW_RESOLUTION][2] = -2.0f;
+
+ normals[POLE_POINTS + i + 3 * ARROW_RESOLUTION][0] = cos(angle);
+ normals[POLE_POINTS + i + 3 * ARROW_RESOLUTION][1] = sin(angle);
+ normals[POLE_POINTS + i + 3 * ARROW_RESOLUTION][2] = 0.0f;
+
+ verts[POLE_POINTS + i + 4 * ARROW_RESOLUTION][0] = 0.25 * width * cos (angle);
+ verts[POLE_POINTS + i + 4 * ARROW_RESOLUTION][1] = 0.25 * width * sin (angle);
+ verts[POLE_POINTS + i + 4 * ARROW_RESOLUTION][2] = -2.0f;
- normals[2 + i + ARROW_RESOLUTION][0] = 0.0f;
- normals[2 + i + ARROW_RESOLUTION][1] = 0.0f;
- normals[2 + i + ARROW_RESOLUTION][2] = -1.0f;
+ normals[POLE_POINTS + i + 4 * ARROW_RESOLUTION][0] = 0.0f;
+ normals[POLE_POINTS + i + 4 * ARROW_RESOLUTION][1] = 0.0f;
+ normals[POLE_POINTS + i + 4 * ARROW_RESOLUTION][2] = -1.0f;
}
/* cone generation */
indices[0] = 0;
for (i = 0; i < ARROW_RESOLUTION + 1; i++) {
- indices[i + 1] = 2 + (i) % (ARROW_RESOLUTION);
+ indices[i + 1] = POLE_POINTS + (i) % (ARROW_RESOLUTION);
}
+ offset += ARROW_RESOLUTION + 2;
- indices[ARROW_RESOLUTION + 2] = 1;
+ indices[offset] = 1;
for (i = 0; i < ARROW_RESOLUTION + 1; i++) {
- indices[ARROW_RESOLUTION + 3 + i] = ARROW_RESOLUTION + 2 + (2 * ARROW_RESOLUTION - i) % (ARROW_RESOLUTION);
+ indices[offset + 1 + i] = ARROW_RESOLUTION + POLE_POINTS + (2 * ARROW_RESOLUTION - i) % (ARROW_RESOLUTION);
+ }
+
+ offset += ARROW_RESOLUTION + 2;
+ j = 0;
+ for (i = 0; i < ARROW_RESOLUTION + 1; i++) {
+ indices[offset + j] = 2 * ARROW_RESOLUTION + POLE_POINTS + (i) % (ARROW_RESOLUTION);
+ indices[offset + j + 1] = 3 * ARROW_RESOLUTION + POLE_POINTS + (i) % (ARROW_RESOLUTION);
+ j += 2;
+ }
+ offset += 2 * ARROW_RESOLUTION + 2;
+
+ indices[offset] = 2;
+ for (i = 0; i < ARROW_RESOLUTION + 1; i++) {
+ indices[offset + 1 + i] = 4 * ARROW_RESOLUTION + POLE_POINTS + (2 * ARROW_RESOLUTION - i) % (ARROW_RESOLUTION);
}
gen = true;
@@ -436,8 +486,8 @@ static void widget_draw_intern(bool select, bool highlight)
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf[1]);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) * (2 * ARROW_RESOLUTION + 4), indices, GL_STATIC_DRAW);
-
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) * (NUM_INDICES), indices, GL_STATIC_DRAW);
+
glEnable(GL_CULL_FACE);
if (highlight)
glColor3f(1.0, 1.0, 0.0);
@@ -445,6 +495,8 @@ static void widget_draw_intern(bool select, bool highlight)
glColor3f(0.0, 1.0, 0.0);
glDrawElements(GL_TRIANGLE_FAN, (ARROW_RESOLUTION + 2), GL_UNSIGNED_SHORT, NULL);
glDrawElements(GL_TRIANGLE_FAN, (ARROW_RESOLUTION + 2), GL_UNSIGNED_SHORT, (GLubyte *)NULL + sizeof(unsigned short) * (ARROW_RESOLUTION + 2));
+ glDrawElements(GL_TRIANGLE_STRIP, (2 * ARROW_RESOLUTION + 2), GL_UNSIGNED_SHORT, (GLubyte *)NULL + sizeof(unsigned short) * (2 * ARROW_RESOLUTION + 4));
+ glDrawElements(GL_TRIANGLE_FAN, (ARROW_RESOLUTION + 2), GL_UNSIGNED_SHORT, (GLubyte *)NULL + sizeof(unsigned short) * (4 * ARROW_RESOLUTION + 6));
glDisable(GL_CULL_FACE);
glBindBuffer(GL_ARRAY_BUFFER, 0);
More information about the Bf-blender-cvs
mailing list