~ubuntu-branches/ubuntu/raring/glmark2/raring

« back to all changes in this revision

Viewing changes to src/scene-ideas/logo.cc

  • Committer: Package Import Robot
  • Author(s): Ricardo Salveti de Araujo
  • Date: 2012-08-21 15:38:09 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20120821153809-bwux72bat8qp2n5v
Tags: 2012.08-0ubuntu1
* New upstream release 2012.08 (LP: #1039736)
  - Avoid crashing if gl used is not >= 2.0 (LP: #842279)
* Bumping dh compatibility level to v9
* debian/control:
  - Update Standards-Version to 3.9.3.
  - Add libjpeg-dev build dependency.
  - Use libegl1-x11-dev as an build-dep alternative instead of libegl1-dev.
  - Update description of glmark2-data binary package.
* debian/copyright:
  - Refresh copyright based on the current upstrem version
* debian/rules:
  - Clean compiled python code from unpacked waflib/ directory, as
    described in http://wiki.debian.org/UnpackWaf

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Vertex position data describing the old Silicon Graphics logo
 
3
 *
 
4
 * (c) Copyright 1993, Silicon Graphics, Inc.
 
5
 * Copyright � 2012 Linaro Limited
 
6
 *
 
7
 * This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
 
8
 *
 
9
 * glmark2 is free software: you can redistribute it and/or modify it under the
 
10
 * terms of the GNU General Public License as published by the Free Software
 
11
 * Foundation, either version 3 of the License, or (at your option) any later
 
12
 * version.
 
13
 *
 
14
 * glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY
 
15
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 
16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 
17
 * details.
 
18
 *
 
19
 * You should have received a copy of the GNU General Public License along with
 
20
 * glmark2.  If not, see <http://www.gnu.org/licenses/>.
 
21
 *
 
22
 * Authors:
 
23
 *  Jesse Barker
 
24
 */
 
25
#include "logo.h"
 
26
#include "scene.h"
 
27
#include "shader-source.h"
 
28
#include "log.h"
 
29
 
 
30
using std::string;
 
31
using LibMatrix::vec3;
 
32
using LibMatrix::uvec3;
 
33
using LibMatrix::vec4;
 
34
using LibMatrix::Stack4;
 
35
using LibMatrix::mat4;
 
36
 
 
37
const unsigned int SGILogo::textureResolution_(32);
 
38
const string SGILogo::modelviewName_("modelview");
 
39
const string SGILogo::projectionName_("projection");
 
40
const string SGILogo::lightPositionName_("light0Position");
 
41
const string SGILogo::logoColorName_("logoColor");
 
42
const string SGILogo::vertexAttribName_("vertex");
 
43
const string SGILogo::normalAttribName_("normal");
 
44
const string SGILogo::normalMatrixName_("normalMatrix");
 
45
 
 
46
SGILogo::SGILogo(void) :
 
47
    normalNormalIndex_(0),
 
48
    normalVertexIndex_(0),
 
49
    flatVertexIndex_(0),
 
50
    shadowVertexIndex_(0),
 
51
    vertexIndex_(0),
 
52
    valid_(false),
 
53
    drawStyle_(LOGO_NORMAL)
 
54
{
 
55
    // Single cylinder data...
 
56
    singleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
57
    singleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 5.000000));
 
58
    singleCylinderVertices_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
59
    singleCylinderVertices_.push_back(vec3(0.707107, 0.707107, 5.000000));
 
60
    singleCylinderVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
61
    singleCylinderVertices_.push_back(vec3(0.000000, 1.000000, 5.000000));
 
62
    singleCylinderVertices_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
63
    singleCylinderVertices_.push_back(vec3(-0.707107, 0.707107, 5.000000));
 
64
    singleCylinderVertices_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
65
    singleCylinderVertices_.push_back(vec3(-1.000000, 0.000000, 5.000000));
 
66
    singleCylinderVertices_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
67
    singleCylinderVertices_.push_back(vec3(-0.707107, -0.707107, 5.000000));
 
68
    singleCylinderVertices_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
69
    singleCylinderVertices_.push_back(vec3(0.000000, -1.000000, 5.000000));
 
70
    singleCylinderVertices_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
71
    singleCylinderVertices_.push_back(vec3(0.707107, -0.707107, 5.000000));
 
72
    singleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
73
    singleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 5.000000));
 
74
 
 
75
    singleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
76
    singleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
77
    singleCylinderNormals_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
78
    singleCylinderNormals_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
79
    singleCylinderNormals_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
80
    singleCylinderNormals_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
81
    singleCylinderNormals_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
82
    singleCylinderNormals_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
83
    singleCylinderNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
84
    singleCylinderNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
85
    singleCylinderNormals_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
86
    singleCylinderNormals_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
87
    singleCylinderNormals_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
88
    singleCylinderNormals_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
89
    singleCylinderNormals_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
90
    singleCylinderNormals_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
91
    singleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
92
    singleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
93
 
 
94
    // Double cylinder data...
 
95
    doubleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
96
    doubleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 7.000000));
 
97
    doubleCylinderVertices_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
98
    doubleCylinderVertices_.push_back(vec3(0.707107, 0.707107, 7.000000));
 
99
    doubleCylinderVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
100
    doubleCylinderVertices_.push_back(vec3(0.000000, 1.000000, 7.000000));
 
101
    doubleCylinderVertices_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
102
    doubleCylinderVertices_.push_back(vec3(-0.707107, 0.707107, 7.000000));
 
103
    doubleCylinderVertices_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
104
    doubleCylinderVertices_.push_back(vec3(-1.000000, 0.000000, 7.000000));
 
105
    doubleCylinderVertices_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
106
    doubleCylinderVertices_.push_back(vec3(-0.707107, -0.707107, 7.000000));
 
107
    doubleCylinderVertices_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
108
    doubleCylinderVertices_.push_back(vec3(0.000000, -1.000000, 7.000000));
 
109
    doubleCylinderVertices_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
110
    doubleCylinderVertices_.push_back(vec3(0.707107, -0.707107, 7.000000));
 
111
    doubleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
112
    doubleCylinderVertices_.push_back(vec3(1.000000, 0.000000, 7.000000));
 
113
 
 
114
    doubleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
115
    doubleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
116
    doubleCylinderNormals_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
117
    doubleCylinderNormals_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
118
    doubleCylinderNormals_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
119
    doubleCylinderNormals_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
120
    doubleCylinderNormals_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
121
    doubleCylinderNormals_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
122
    doubleCylinderNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
123
    doubleCylinderNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
124
    doubleCylinderNormals_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
125
    doubleCylinderNormals_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
126
    doubleCylinderNormals_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
127
    doubleCylinderNormals_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
128
    doubleCylinderNormals_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
129
    doubleCylinderNormals_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
130
    doubleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
131
    doubleCylinderNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
132
 
 
133
    // Elbow data...
 
134
    elbowVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
135
    elbowVertices_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
136
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
137
    elbowVertices_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
138
    elbowVertices_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
139
    elbowVertices_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
140
    elbowVertices_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
141
    elbowVertices_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
142
    elbowVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
143
    elbowVertices_.push_back(vec3(1.000000, 0.034074, 0.258819));
 
144
    elbowVertices_.push_back(vec3(0.707107, 0.717087, 0.075806));
 
145
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
146
    elbowVertices_.push_back(vec3(-0.707107, 0.717087, 0.075806));
 
147
    elbowVertices_.push_back(vec3(-1.000000, 0.034074, 0.258819));
 
148
    elbowVertices_.push_back(vec3(-0.707107, -0.648939, 0.441832));
 
149
    elbowVertices_.push_back(vec3(0.000000, -0.931852, 0.517638));
 
150
    elbowVertices_.push_back(vec3(0.707107, -0.648939, 0.441832));
 
151
    elbowVertices_.push_back(vec3(1.000000, 0.034074, 0.258819));
 
152
    elbowVertices_.push_back(vec3(1.000000, 0.133975, 0.500000));
 
153
    elbowVertices_.push_back(vec3(0.707107, 0.746347, 0.146447));
 
154
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
155
    elbowVertices_.push_back(vec3(-0.707107, 0.746347, 0.146447));
 
156
    elbowVertices_.push_back(vec3(-1.000000, 0.133975, 0.500000));
 
157
    elbowVertices_.push_back(vec3(-0.707107, -0.478398, 0.853553));
 
158
    elbowVertices_.push_back(vec3(0.000000, -0.732051, 1.000000));
 
159
    elbowVertices_.push_back(vec3(0.707107, -0.478398, 0.853553));
 
160
    elbowVertices_.push_back(vec3(1.000000, 0.133975, 0.500000));
 
161
    elbowVertices_.push_back(vec3(1.000000, 0.292893, 0.707107));
 
162
    elbowVertices_.push_back(vec3(0.707107, 0.792893, 0.207107));
 
163
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
164
    elbowVertices_.push_back(vec3(-0.707107, 0.792893, 0.207107));
 
165
    elbowVertices_.push_back(vec3(-1.000000, 0.292893, 0.707107));
 
166
    elbowVertices_.push_back(vec3(-0.707107, -0.207107, 1.207107));
 
167
    elbowVertices_.push_back(vec3(0.000000, -0.414214, 1.414214));
 
168
    elbowVertices_.push_back(vec3(0.707107, -0.207107, 1.207107));
 
169
    elbowVertices_.push_back(vec3(1.000000, 0.292893, 0.707107));
 
170
    elbowVertices_.push_back(vec3(1.000000, 0.500000, 0.866025));
 
171
    elbowVertices_.push_back(vec3(0.707107, 0.853553, 0.253653));
 
172
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
173
    elbowVertices_.push_back(vec3(-0.707107, 0.853553, 0.253653));
 
174
    elbowVertices_.push_back(vec3(-1.000000, 0.500000, 0.866025));
 
175
    elbowVertices_.push_back(vec3(-0.707107, 0.146447, 1.478398));
 
176
    elbowVertices_.push_back(vec3(0.000000, 0.000000, 1.732051));
 
177
    elbowVertices_.push_back(vec3(0.707107, 0.146447, 1.478398));
 
178
    elbowVertices_.push_back(vec3(1.000000, 0.500000, 0.866025));
 
179
    elbowVertices_.push_back(vec3(1.000000, 0.741181, 0.965926));
 
180
    elbowVertices_.push_back(vec3(0.707107, 0.924194, 0.282913));
 
181
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
182
    elbowVertices_.push_back(vec3(-0.707107, 0.924194, 0.282913));
 
183
    elbowVertices_.push_back(vec3(-1.000000, 0.741181, 0.965926));
 
184
    elbowVertices_.push_back(vec3(-0.707107, 0.558168, 1.648939));
 
185
    elbowVertices_.push_back(vec3(0.000000, 0.482362, 1.931852));
 
186
    elbowVertices_.push_back(vec3(0.707107, 0.558168, 1.648939));
 
187
    elbowVertices_.push_back(vec3(1.000000, 0.741181, 0.965926));
 
188
    elbowVertices_.push_back(vec3(1.000000, 1.000000, 1.000000));
 
189
    elbowVertices_.push_back(vec3(0.707107, 1.000000, 0.292893));
 
190
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
191
    elbowVertices_.push_back(vec3(-0.707107, 1.000000, 0.292893));
 
192
    elbowVertices_.push_back(vec3(-1.000000, 1.000000, 1.000000));
 
193
    elbowVertices_.push_back(vec3(-0.707107, 1.000000, 1.707107));
 
194
    elbowVertices_.push_back(vec3(0.000000, 1.000000, 2.000000));
 
195
    elbowVertices_.push_back(vec3(0.707107, 1.000000, 1.707107));
 
196
    elbowVertices_.push_back(vec3(1.000000, 1.000000, 1.000000));
 
197
 
 
198
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
199
    elbowNormals_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
200
    elbowNormals_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
201
    elbowNormals_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
202
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
203
    elbowNormals_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
204
    elbowNormals_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
205
    elbowNormals_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
206
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
207
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
208
    elbowNormals_.push_back(vec3(0.707107, 0.683013, -0.183013));
 
209
    elbowNormals_.push_back(vec3(0.000000, 0.965926, -0.258819));
 
210
    elbowNormals_.push_back(vec3(-0.707107, 0.683013, -0.183013));
 
211
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
212
    elbowNormals_.push_back(vec3(-0.707107, -0.683013, 0.183013));
 
213
    elbowNormals_.push_back(vec3(0.000000, -0.965926, 0.258819));
 
214
    elbowNormals_.push_back(vec3(0.707107, -0.683013, 0.183013));
 
215
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
216
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
217
    elbowNormals_.push_back(vec3(0.707107, 0.612372, -0.353553));
 
218
    elbowNormals_.push_back(vec3(0.000000, 0.866025, -0.500000));
 
219
    elbowNormals_.push_back(vec3(-0.707107, 0.612372, -0.353553));
 
220
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
221
    elbowNormals_.push_back(vec3(-0.707107, -0.612372, 0.353553));
 
222
    elbowNormals_.push_back(vec3(0.000000, -0.866025, 0.500000));
 
223
    elbowNormals_.push_back(vec3(0.707107, -0.612372, 0.353553));
 
224
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
225
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
226
    elbowNormals_.push_back(vec3(0.707107, 0.500000, -0.500000));
 
227
    elbowNormals_.push_back(vec3(0.000000, 0.707107, -0.707107));
 
228
    elbowNormals_.push_back(vec3(-0.707107, 0.500000, -0.500000));
 
229
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
230
    elbowNormals_.push_back(vec3(-0.707107, -0.500000, 0.500000));
 
231
    elbowNormals_.push_back(vec3(0.000000, -0.707107, 0.707107));
 
232
    elbowNormals_.push_back(vec3(0.707107, -0.500000, 0.500000));
 
233
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
234
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
235
    elbowNormals_.push_back(vec3(0.707107, 0.353553, -0.612372));
 
236
    elbowNormals_.push_back(vec3(0.000000, 0.500000, -0.866025));
 
237
    elbowNormals_.push_back(vec3(-0.707107, 0.353553, -0.612372));
 
238
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
239
    elbowNormals_.push_back(vec3(-0.707107, -0.353553, 0.612372));
 
240
    elbowNormals_.push_back(vec3(0.000000, -0.500000, 0.866025));
 
241
    elbowNormals_.push_back(vec3(0.707107, -0.353553, 0.612372));
 
242
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
243
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
244
    elbowNormals_.push_back(vec3(0.707107, 0.183013, -0.683013));
 
245
    elbowNormals_.push_back(vec3(0.000000, 0.258819, -0.965926));
 
246
    elbowNormals_.push_back(vec3(-0.707107, 0.183013, -0.683013));
 
247
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
248
    elbowNormals_.push_back(vec3(-0.707107, -0.183013, 0.683013));
 
249
    elbowNormals_.push_back(vec3(0.000000, -0.258819, 0.965926));
 
250
    elbowNormals_.push_back(vec3(0.707107, -0.183013, 0.683013));
 
251
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
252
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
253
    elbowNormals_.push_back(vec3(0.707107, 0.000000, -0.707107));
 
254
    elbowNormals_.push_back(vec3(0.000000, 0.000000, -1.000000));
 
255
    elbowNormals_.push_back(vec3(-0.707107, 0.000000, -0.707107));
 
256
    elbowNormals_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
257
    elbowNormals_.push_back(vec3(-0.707107, 0.000000, 0.707107));
 
258
    elbowNormals_.push_back(vec3(0.000000, 0.000000, 1.000000));
 
259
    elbowNormals_.push_back(vec3(0.707107, 0.000000, 0.707107));
 
260
    elbowNormals_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
261
 
 
262
    elbowShadowVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
263
    elbowShadowVertices_.push_back(vec3(0.707107, 0.707107, 0.000000));
 
264
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
265
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.707107, 0.000000));
 
266
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.000000, 0.000000));
 
267
    elbowShadowVertices_.push_back(vec3(-0.707107, -0.707107, 0.000000));
 
268
    elbowShadowVertices_.push_back(vec3(0.000000, -1.000000, 0.000000));
 
269
    elbowShadowVertices_.push_back(vec3(0.707107, -0.707107, 0.000000));
 
270
    elbowShadowVertices_.push_back(vec3(1.000000, 0.000000, 0.000000));
 
271
    elbowShadowVertices_.push_back(vec3(1.000000, 0.019215, 0.195090));
 
272
    elbowShadowVertices_.push_back(vec3(0.707107, 0.712735, 0.057141));
 
273
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
274
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.712735, 0.057141));
 
275
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.019215, 0.195090));
 
276
    elbowShadowVertices_.push_back(vec3(-0.707107, -0.674305, 0.333040));
 
277
    elbowShadowVertices_.push_back(vec3(0.000000, -0.961571, 0.390181));
 
278
    elbowShadowVertices_.push_back(vec3(0.707107, -0.674305, 0.333040));
 
279
    elbowShadowVertices_.push_back(vec3(1.000000, 0.019215, 0.195090));
 
280
    elbowShadowVertices_.push_back(vec3(1.000000, 0.076120, 0.382683));
 
281
    elbowShadowVertices_.push_back(vec3(0.707107, 0.729402, 0.112085));
 
282
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
283
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.729402, 0.112085));
 
284
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.076120, 0.382683));
 
285
    elbowShadowVertices_.push_back(vec3(-0.707107, -0.577161, 0.653282));
 
286
    elbowShadowVertices_.push_back(vec3(0.000000, -0.847759, 0.765367));
 
287
    elbowShadowVertices_.push_back(vec3(0.707107, -0.577161, 0.653282));
 
288
    elbowShadowVertices_.push_back(vec3(1.000000, 0.076120, 0.382683));
 
289
    elbowShadowVertices_.push_back(vec3(1.000000, 0.168530, 0.555570));
 
290
    elbowShadowVertices_.push_back(vec3(0.707107, 0.756468, 0.162723));
 
291
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
292
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.756468, 0.162723));
 
293
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.168530, 0.555570));
 
294
    elbowShadowVertices_.push_back(vec3(-0.707107, -0.419407, 0.948418));
 
295
    elbowShadowVertices_.push_back(vec3(0.000000, -0.662939, 1.111140));
 
296
    elbowShadowVertices_.push_back(vec3(0.707107, -0.419407, 0.948418));
 
297
    elbowShadowVertices_.push_back(vec3(1.000000, 0.168530, 0.555570));
 
298
    elbowShadowVertices_.push_back(vec3(1.000000, 0.292893, 0.707107));
 
299
    elbowShadowVertices_.push_back(vec3(0.707107, 0.792893, 0.207107));
 
300
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
301
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.792893, 0.207107));
 
302
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.292893, 0.707107));
 
303
    elbowShadowVertices_.push_back(vec3(-0.707107, -0.207107, 1.207107));
 
304
    elbowShadowVertices_.push_back(vec3(0.000000, -0.414214, 1.414214));
 
305
    elbowShadowVertices_.push_back(vec3(0.707107, -0.207107, 1.207107));
 
306
    elbowShadowVertices_.push_back(vec3(1.000000, 0.292893, 0.707107));
 
307
    elbowShadowVertices_.push_back(vec3(1.000000, 0.444430, 0.831470));
 
308
    elbowShadowVertices_.push_back(vec3(0.707107, 0.837277, 0.243532));
 
309
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
310
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.837277, 0.243532));
 
311
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.444430, 0.831470));
 
312
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.051582, 1.419407));
 
313
    elbowShadowVertices_.push_back(vec3(0.000000, -0.111140, 1.662939));
 
314
    elbowShadowVertices_.push_back(vec3(0.707107, 0.051582, 1.419407));
 
315
    elbowShadowVertices_.push_back(vec3(1.000000, 0.444430, 0.831470));
 
316
    elbowShadowVertices_.push_back(vec3(1.000000, 0.617317, 0.923880));
 
317
    elbowShadowVertices_.push_back(vec3(0.707107, 0.887915, 0.270598));
 
318
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
319
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.887915, 0.270598));
 
320
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.617317, 0.923880));
 
321
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.346719, 1.577161));
 
322
    elbowShadowVertices_.push_back(vec3(0.000000, 0.234633, 1.847759));
 
323
    elbowShadowVertices_.push_back(vec3(0.707107, 0.346719, 1.577161));
 
324
    elbowShadowVertices_.push_back(vec3(1.000000, 0.617317, 0.923880));
 
325
    elbowShadowVertices_.push_back(vec3(1.000000, 0.804910, 0.980785));
 
326
    elbowShadowVertices_.push_back(vec3(0.707107, 0.942859, 0.287265));
 
327
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
328
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.942859, 0.287265));
 
329
    elbowShadowVertices_.push_back(vec3(-1.000000, 0.804910, 0.980785));
 
330
    elbowShadowVertices_.push_back(vec3(-0.707107, 0.666960, 1.674305));
 
331
    elbowShadowVertices_.push_back(vec3(0.000000, 0.609819, 1.961571));
 
332
    elbowShadowVertices_.push_back(vec3(0.707107, 0.666960, 1.674305));
 
333
    elbowShadowVertices_.push_back(vec3(1.000000, 0.804910, 0.980785));
 
334
    elbowShadowVertices_.push_back(vec3(1.000000, 1.000000, 1.000000));
 
335
    elbowShadowVertices_.push_back(vec3(0.707107, 1.000000, 0.292893));
 
336
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 0.000000));
 
337
    elbowShadowVertices_.push_back(vec3(-0.707107, 1.000000, 0.292893));
 
338
    elbowShadowVertices_.push_back(vec3(-1.000000, 1.000000, 1.000000));
 
339
    elbowShadowVertices_.push_back(vec3(-0.707107, 1.000000, 1.707107));
 
340
    elbowShadowVertices_.push_back(vec3(0.000000, 1.000000, 2.000000));
 
341
    elbowShadowVertices_.push_back(vec3(0.707107, 1.000000, 1.707107));
 
342
    elbowShadowVertices_.push_back(vec3(1.000000, 1.000000, 1.000000));
 
343
 
 
344
    // Now that we've setup the vertex data, we can setup the map of how
 
345
    // that data will be laid out in the buffer object.
 
346
    static const unsigned int sv3(sizeof(vec3));
 
347
    dataMap_.scvOffset = 0;
 
348
    dataMap_.scvSize = singleCylinderVertices_.size() * sv3;
 
349
    dataMap_.totalSize = dataMap_.scvSize;
 
350
    dataMap_.scnOffset = dataMap_.scvOffset + dataMap_.scvSize;
 
351
    dataMap_.scnSize = singleCylinderNormals_.size() * sv3;
 
352
    dataMap_.totalSize += dataMap_.scnSize;
 
353
    dataMap_.dcvOffset = dataMap_.scnOffset + dataMap_.scnSize;
 
354
    dataMap_.dcvSize = doubleCylinderVertices_.size() * sv3;
 
355
    dataMap_.totalSize += dataMap_.dcvSize;
 
356
    dataMap_.dcnOffset = dataMap_.dcvOffset + dataMap_.dcvSize;
 
357
    dataMap_.dcnSize = doubleCylinderNormals_.size() * sv3;
 
358
    dataMap_.totalSize += dataMap_.dcnSize;
 
359
    dataMap_.evOffset = dataMap_.dcnOffset + dataMap_.dcnSize;
 
360
    dataMap_.evSize = elbowVertices_.size() * sv3;
 
361
    dataMap_.totalSize += dataMap_.evSize;
 
362
    dataMap_.enOffset = dataMap_.evOffset + dataMap_.evSize;
 
363
    dataMap_.enSize = elbowNormals_.size() * sv3;
 
364
    dataMap_.totalSize += dataMap_.enSize;
 
365
    dataMap_.esvOffset = dataMap_.enOffset + dataMap_.enSize;
 
366
    dataMap_.esvSize = elbowShadowVertices_.size() * sv3;
 
367
    dataMap_.totalSize += dataMap_.esvSize;
 
368
 
 
369
    //
 
370
    // The original implementation of both the logo and the lamp represented
 
371
    // the vertex and normal data in a triply-dimensioned array of floats and
 
372
    // all of the calls referenced double-indexed arrays of vector data.
 
373
    // To my mind, this made the code look clunky and overly verbose.
 
374
    // Representing the data as a STL vector of vec3 (itself a 3-float vector
 
375
    // quantity) provides both an efficient container and allows for more
 
376
    // concise looking code.  The slightly goofy loops (using the original 2
 
377
    // dimensional indices to compute a single offset into the STL vector) are 
 
378
    // a compromise to avoid rearranging the original data.
 
379
    //
 
380
    // - jesse 2010/10/04
 
381
    //
 
382
    for (unsigned int i = 0; i < 8; i++)
 
383
    {
 
384
        for (unsigned int j = 0; j < 9; j++)
 
385
        {
 
386
            unsigned int index1(i * 9 + j);
 
387
            unsigned int index2((i + 1) * 9 + j);
 
388
            indexData_.push_back(index1);
 
389
            indexData_.push_back(index2);
 
390
        }
 
391
    }
 
392
 
 
393
    // Initialize the stipple pattern
 
394
    static const unsigned int patterns[] = { 0xaaaaaaaa, 0x55555555 };
 
395
    for (unsigned int i = 0; i < textureResolution_; i++)
 
396
    {
 
397
        for (unsigned int j = 0; j < textureResolution_; j++)
 
398
        {
 
399
            // Alternate the pattern every other line.
 
400
            unsigned int curMask(1 << j);
 
401
            unsigned int curPattern(patterns[i % 2]);
 
402
            textureImage_[i][j] = ((curPattern & curMask) >> j) * 255;
 
403
        }
 
404
    }
 
405
}
 
406
 
 
407
SGILogo::~SGILogo()
 
408
{
 
409
    if (valid_)
 
410
    {
 
411
        glDeleteBuffers(2, &bufferObjects_[0]);
 
412
    }
 
413
}
 
414
 
 
415
void
 
416
SGILogo::init()
 
417
{
 
418
    // Make sure we don't re-initialize...
 
419
    if (valid_)
 
420
    {
 
421
        return;
 
422
    }
 
423
 
 
424
    // Initialize shader sources from input files and create programs from them
 
425
    // The program for handling the main object with lighting...
 
426
    string logo_vtx_filename(GLMARK_DATA_PATH"/shaders/ideas-logo.vert");
 
427
    string logo_frg_filename(GLMARK_DATA_PATH"/shaders/ideas-logo.frag");
 
428
    ShaderSource logo_vtx_source(logo_vtx_filename);
 
429
    ShaderSource logo_frg_source(logo_frg_filename);
 
430
    if (!Scene::load_shaders_from_strings(normalProgram_, logo_vtx_source.str(),
 
431
                                          logo_frg_source.str()))
 
432
    {
 
433
        Log::error("No valid program for normal logo rendering\n");
 
434
        return;
 
435
    }
 
436
    normalVertexIndex_ = normalProgram_[vertexAttribName_].location();
 
437
    normalNormalIndex_ = normalProgram_[normalAttribName_].location();
 
438
 
 
439
    // The program for handling the flat object...
 
440
    string logo_flat_vtx_filename(GLMARK_DATA_PATH"/shaders/ideas-logo-flat.vert");
 
441
    string logo_flat_frg_filename(GLMARK_DATA_PATH"/shaders/ideas-logo-flat.frag");
 
442
    ShaderSource logo_flat_vtx_source(logo_flat_vtx_filename);
 
443
    ShaderSource logo_flat_frg_source(logo_flat_frg_filename);
 
444
    if (!Scene::load_shaders_from_strings(flatProgram_, logo_flat_vtx_source.str(),
 
445
                                          logo_flat_frg_source.str()))
 
446
    {
 
447
        Log::error("No valid program for flat logo rendering\n");
 
448
        return;
 
449
    }
 
450
    flatVertexIndex_ = flatProgram_[vertexAttribName_].location();
 
451
 
 
452
    // The program for handling the shadow object with texturing...
 
453
    string logo_shadow_vtx_filename(GLMARK_DATA_PATH"/shaders/ideas-logo-shadow.vert");
 
454
    string logo_shadow_frg_filename(GLMARK_DATA_PATH"/shaders/ideas-logo-shadow.frag");
 
455
    ShaderSource logo_shadow_vtx_source(logo_shadow_vtx_filename);
 
456
    ShaderSource logo_shadow_frg_source(logo_shadow_frg_filename);
 
457
    if (!Scene::load_shaders_from_strings(shadowProgram_, logo_shadow_vtx_source.str(),
 
458
                                          logo_shadow_frg_source.str()))
 
459
    {
 
460
        Log::error("No valid program for shadow logo rendering\n");
 
461
        return;
 
462
    }
 
463
    shadowVertexIndex_ = shadowProgram_[vertexAttribName_].location();
 
464
 
 
465
    // We need 2 buffers for our work here.  One for the vertex data.
 
466
    // and one for the index data.
 
467
    glGenBuffers(2, &bufferObjects_[0]);
 
468
 
 
469
    // First, setup the vertex data by binding the first buffer object, 
 
470
    // allocating its data store, and filling it in with our vertex data.
 
471
    glBindBuffer(GL_ARRAY_BUFFER, bufferObjects_[0]);
 
472
    glBufferData(GL_ARRAY_BUFFER, dataMap_.totalSize, 0, GL_STATIC_DRAW);
 
473
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.scvOffset, dataMap_.scvSize,
 
474
                    &singleCylinderVertices_.front());
 
475
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.scnOffset, dataMap_.scnSize,
 
476
                    &singleCylinderNormals_.front());
 
477
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.dcvOffset, dataMap_.dcvSize,
 
478
                    &doubleCylinderVertices_.front());
 
479
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.dcnOffset, dataMap_.dcnSize,
 
480
                    &doubleCylinderNormals_.front());
 
481
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.evOffset, dataMap_.evSize,
 
482
                    &elbowVertices_.front());
 
483
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.enOffset, dataMap_.enSize, 
 
484
                    &elbowNormals_.front());
 
485
    glBufferSubData(GL_ARRAY_BUFFER, dataMap_.esvOffset, dataMap_.esvSize, 
 
486
                    &elbowShadowVertices_.front());
 
487
 
 
488
    // Now repeat for our index data.
 
489
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects_[1]);
 
490
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData_.size() * sizeof(unsigned short),
 
491
                 &indexData_.front(), GL_STATIC_DRAW);
 
492
 
 
493
    // Setup our the texture that the shadow program will use...
 
494
    glGenTextures(1, &textureName_);
 
495
    glBindTexture(GL_TEXTURE_2D, textureName_);
 
496
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 
497
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
498
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
499
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
500
    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,
 
501
                 textureResolution_, textureResolution_,
 
502
                 0, GL_ALPHA, GL_UNSIGNED_BYTE, textureImage_);
 
503
 
 
504
    // We're ready to go.
 
505
    valid_ = true;
 
506
}
 
507
 
 
508
void
 
509
SGILogo::bendForward(Stack4& ms)
 
510
{
 
511
    ms.translate(0.0, 1.0, 0.0);
 
512
    ms.rotate(90.0, 1.0, 0.0, 0.0);
 
513
    ms.translate(0.0, -1.0, 0.0);
 
514
}
 
515
 
 
516
void
 
517
SGILogo::bendLeft(Stack4& ms)
 
518
{
 
519
    ms.rotate(-90.0, 0.0, 0.0, 1.0);
 
520
    ms.translate(0.0, 1.0, 0.0);
 
521
    ms.rotate(90.0, 1.0, 0.0, 0.0);
 
522
    ms.translate(0.0, -1.0, 0.0);
 
523
}
 
524
 
 
525
void
 
526
SGILogo::bendRight(Stack4& ms) 
 
527
{
 
528
    ms.rotate(90.0, 0.0, 0.0, 1.0);
 
529
    ms.translate(0.0, 1.0, 0.0);
 
530
    ms.rotate(90.0, 1.0, 0.0, 0.0);
 
531
    ms.translate(0.0, -1.0, 0.0);
 
532
}
 
533
 
 
534
void
 
535
SGILogo::drawDoubleCylinder(void)
 
536
{
 
537
    glVertexAttribPointer(vertexIndex_, 3, GL_FLOAT, GL_FALSE, 0, 
 
538
        reinterpret_cast<const GLvoid*>(dataMap_.dcvOffset));
 
539
    if (drawStyle_ == LOGO_NORMAL)
 
540
    {
 
541
        glVertexAttribPointer(normalNormalIndex_, 3, GL_FLOAT, GL_FALSE, 0, 
 
542
            reinterpret_cast<const GLvoid*>(dataMap_.dcnOffset));
 
543
    }
 
544
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 18);
 
545
}
 
546
 
 
547
void
 
548
SGILogo::drawSingleCylinder(void)
 
549
{
 
550
    glVertexAttribPointer(vertexIndex_, 3, GL_FLOAT, GL_FALSE, 0,
 
551
        reinterpret_cast<const GLvoid*>(dataMap_.scvOffset));
 
552
    if (drawStyle_ == LOGO_NORMAL)
 
553
    {
 
554
        glVertexAttribPointer(normalNormalIndex_, 3, GL_FLOAT, GL_FALSE, 0, 
 
555
            reinterpret_cast<const GLvoid*>(dataMap_.scnOffset));
 
556
    }
 
557
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 18);
 
558
}
 
559
 
 
560
void
 
561
SGILogo::drawElbow(void)
 
562
{
 
563
    unsigned int startIdx(0);
 
564
    unsigned int endIdx(6);
 
565
    if (drawStyle_ == LOGO_NORMAL)
 
566
    {
 
567
        glVertexAttribPointer(vertexIndex_, 3, GL_FLOAT, GL_FALSE, 0,
 
568
            reinterpret_cast<const GLvoid*>(dataMap_.evOffset));
 
569
        glVertexAttribPointer(normalNormalIndex_, 3, GL_FLOAT, GL_FALSE, 0,
 
570
            reinterpret_cast<const GLvoid*>(dataMap_.enOffset));
 
571
    }
 
572
    else
 
573
    {
 
574
        endIdx = 8;
 
575
        glVertexAttribPointer(vertexIndex_, 3, GL_FLOAT, GL_FALSE, 0,
 
576
            reinterpret_cast<const GLvoid*>(dataMap_.esvOffset));
 
577
    }
 
578
 
 
579
    for (unsigned int i = startIdx; i < endIdx; i++)
 
580
    {
 
581
        unsigned int curOffset(i * 18 * sizeof(unsigned short));
 
582
        glDrawElements(GL_TRIANGLE_STRIP, 18, GL_UNSIGNED_SHORT, 
 
583
             reinterpret_cast<const GLvoid*>(curOffset));
 
584
    }
 
585
}
 
586
 
 
587
// Generate a normal matrix from a modelview matrix
 
588
//
 
589
// Since we can't universally handle the normal matrix inside the
 
590
// vertex shader (inverse() and transpose() built-ins not supported by
 
591
// GLSL ES, for example), we'll generate it here, and load it as a
 
592
// uniform.
 
593
void
 
594
SGILogo::updateXform(const mat4& mv, Program& program)
 
595
{
 
596
    if (drawStyle_ == LOGO_NORMAL)
 
597
    {
 
598
        LibMatrix::mat3 normalMatrix(mv[0][0], mv[1][0], mv[2][0],
 
599
                                     mv[0][1], mv[1][1], mv[2][1],
 
600
                                     mv[0][2], mv[1][2], mv[2][2]);
 
601
        normalMatrix.transpose().inverse();
 
602
        program[normalMatrixName_] = normalMatrix;
 
603
    }
 
604
    program[modelviewName_] = mv;
 
605
}
 
606
 
 
607
Program&
 
608
SGILogo::getProgram()
 
609
{
 
610
    switch (drawStyle_)
 
611
    {
 
612
        case LOGO_NORMAL:
 
613
            return normalProgram_;
 
614
            break;
 
615
        case LOGO_FLAT:
 
616
            return flatProgram_;
 
617
            break;
 
618
        case LOGO_SHADOW:
 
619
            return shadowProgram_;
 
620
            break;            
 
621
    }
 
622
 
 
623
    return normalProgram_;
 
624
}
 
625
 
 
626
void
 
627
SGILogo::draw(Stack4& modelview, 
 
628
    Stack4& projection, 
 
629
    const vec4& lightPosition,
 
630
    DrawStyle style,
 
631
    const uvec3& currentColor)
 
632
{
 
633
    if (!valid_)
 
634
    {
 
635
        return;
 
636
    }
 
637
 
 
638
    glBindBuffer(GL_ARRAY_BUFFER, bufferObjects_[0]);
 
639
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects_[1]);
 
640
 
 
641
    // Setup the program to use based upon draw style and set it running.
 
642
    drawStyle_ = style;
 
643
    vec4 logoColor(currentColor.x() / 255.0, currentColor.y() / 255.0, currentColor.z() / 255.0, 1.0);
 
644
    Program& curProgram = getProgram();
 
645
    curProgram.start();
 
646
    switch (drawStyle_)
 
647
    {
 
648
        case LOGO_NORMAL:
 
649
            curProgram[lightPositionName_] = lightPosition;
 
650
            vertexIndex_ = normalVertexIndex_;
 
651
            glEnableVertexAttribArray(normalNormalIndex_);
 
652
            break;
 
653
        case LOGO_FLAT:
 
654
            curProgram[logoColorName_] = logoColor;
 
655
            vertexIndex_ = flatVertexIndex_;
 
656
            break;
 
657
        case LOGO_SHADOW:
 
658
            vertexIndex_ = shadowVertexIndex_;
 
659
            break;            
 
660
    }
 
661
 
 
662
    glEnableVertexAttribArray(vertexIndex_);
 
663
    curProgram[projectionName_] = projection.getCurrent();
 
664
    modelview.translate(5.500000, -3.500000, 4.500000);
 
665
    modelview.translate(0.0,  0.0,  -7.000000);
 
666
    updateXform(modelview.getCurrent(), curProgram);
 
667
    drawDoubleCylinder();
 
668
    bendForward(modelview);
 
669
    updateXform(modelview.getCurrent(), curProgram);
 
670
    drawElbow();
 
671
    modelview.translate(0.0, 0.0, -7.000000);
 
672
    updateXform(modelview.getCurrent(), curProgram);
 
673
    drawDoubleCylinder();
 
674
    bendForward(modelview);
 
675
    updateXform(modelview.getCurrent(), curProgram);
 
676
    drawElbow();
 
677
    modelview.translate(0.0, 0.0, -5.000000);
 
678
    updateXform(modelview.getCurrent(), curProgram);
 
679
    drawSingleCylinder();
 
680
    bendRight(modelview);
 
681
    updateXform(modelview.getCurrent(), curProgram);
 
682
    drawElbow();
 
683
    modelview.translate(0.0, 0.0, -7.000000);
 
684
    updateXform(modelview.getCurrent(), curProgram);
 
685
    drawDoubleCylinder();
 
686
    bendForward(modelview);
 
687
    updateXform(modelview.getCurrent(), curProgram);
 
688
    drawElbow();
 
689
    modelview.translate(0.0, 0.0, -7.000000);
 
690
    updateXform(modelview.getCurrent(), curProgram);
 
691
    drawDoubleCylinder();
 
692
    bendForward(modelview);
 
693
    updateXform(modelview.getCurrent(), curProgram);
 
694
    drawElbow();
 
695
    modelview.translate(0.0, 0.0, -5.000000);
 
696
    updateXform(modelview.getCurrent(), curProgram);
 
697
    drawSingleCylinder();
 
698
    bendLeft(modelview);
 
699
    updateXform(modelview.getCurrent(), curProgram);
 
700
    drawElbow();
 
701
    modelview.translate(0.0, 0.0, -7.000000);
 
702
    updateXform(modelview.getCurrent(), curProgram);
 
703
    drawDoubleCylinder();
 
704
    bendForward(modelview);
 
705
    updateXform(modelview.getCurrent(), curProgram);
 
706
    drawElbow();
 
707
    modelview.translate(0.0, 0.0, -7.000000);
 
708
    updateXform(modelview.getCurrent(), curProgram);
 
709
    drawDoubleCylinder();
 
710
    bendForward(modelview);
 
711
    updateXform(modelview.getCurrent(), curProgram);
 
712
    drawElbow();
 
713
    modelview.translate(0.0, 0.0, -5.000000);
 
714
    updateXform(modelview.getCurrent(), curProgram);
 
715
    drawSingleCylinder();
 
716
    bendRight(modelview);
 
717
    updateXform(modelview.getCurrent(), curProgram);
 
718
    drawElbow();
 
719
    modelview.translate(0.0, 0.0, -7.000000);
 
720
    updateXform(modelview.getCurrent(), curProgram);
 
721
    drawDoubleCylinder();
 
722
    bendForward(modelview);
 
723
    updateXform(modelview.getCurrent(), curProgram);
 
724
    drawElbow();
 
725
    modelview.translate(0.0, 0.0, -7.000000);
 
726
    updateXform(modelview.getCurrent(), curProgram);
 
727
    drawDoubleCylinder();
 
728
    bendForward(modelview);
 
729
    updateXform(modelview.getCurrent(), curProgram);
 
730
    drawElbow();
 
731
    modelview.translate(0.0, 0.0, -5.000000);
 
732
    updateXform(modelview.getCurrent(), curProgram);
 
733
    drawSingleCylinder();
 
734
    bendLeft(modelview);
 
735
    updateXform(modelview.getCurrent(), curProgram);
 
736
    drawElbow();
 
737
    modelview.translate(0.0, 0.0, -7.000000);
 
738
    updateXform(modelview.getCurrent(), curProgram);
 
739
    drawDoubleCylinder();
 
740
    bendForward(modelview);
 
741
    updateXform(modelview.getCurrent(), curProgram);
 
742
    drawElbow();
 
743
    modelview.translate(0.0, 0.0, -7.000000);
 
744
    updateXform(modelview.getCurrent(), curProgram);
 
745
    drawDoubleCylinder();
 
746
    bendForward(modelview);
 
747
    updateXform(modelview.getCurrent(), curProgram);
 
748
    drawElbow();
 
749
    modelview.translate(0.0, 0.0, -5.000000);
 
750
    updateXform(modelview.getCurrent(), curProgram);
 
751
    drawSingleCylinder();
 
752
    bendRight(modelview);
 
753
    updateXform(modelview.getCurrent(), curProgram);
 
754
    drawElbow();
 
755
    modelview.translate(0.0, 0.0, -7.000000);
 
756
    updateXform(modelview.getCurrent(), curProgram);
 
757
    drawDoubleCylinder();
 
758
    bendForward(modelview);
 
759
    updateXform(modelview.getCurrent(), curProgram);
 
760
    drawElbow();
 
761
    modelview.translate(0.0, 0.0, -7.000000);
 
762
    updateXform(modelview.getCurrent(), curProgram);
 
763
    drawDoubleCylinder();
 
764
    bendForward(modelview);
 
765
    updateXform(modelview.getCurrent(), curProgram);
 
766
    drawElbow();
 
767
    modelview.translate(0.0, 0.0, -5.000000);
 
768
    updateXform(modelview.getCurrent(), curProgram);
 
769
    drawSingleCylinder();
 
770
    bendLeft(modelview);
 
771
    updateXform(modelview.getCurrent(), curProgram);
 
772
    drawElbow();
 
773
    glDisableVertexAttribArray(vertexIndex_);
 
774
    switch (drawStyle_)
 
775
    {
 
776
        case LOGO_NORMAL:
 
777
            glDisableVertexAttribArray(normalNormalIndex_);
 
778
            break;
 
779
        case LOGO_FLAT:
 
780
            break;
 
781
        case LOGO_SHADOW:
 
782
            break;            
 
783
    }
 
784
    curProgram.stop();
 
785
 
 
786
    glBindBuffer(GL_ARRAY_BUFFER, 0);
 
787
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 
788
}