2 #include "primitivebuilder.h"
8 UvSphereBuilder::UvSphereBuilder(float r, unsigned s, unsigned n):
17 rings = (segments+1)/2;
22 void UvSphereBuilder::build(PrimitiveBuilder &builder) const
24 float u_scale = 1.0f/segments;
25 float v_scale = 1.0f/rings;
26 adjust_texture_scale(u_scale, v_scale, radius*M_PI*2, radius*M_PI);
28 for(unsigned i=0; i<=rings; ++i)
30 float av = i*M_PI/rings-M_PI/2;
34 for(unsigned j=0; j<=segments; ++j)
36 float au = j*M_PI*2/segments;
40 builder.normal(cv*cu, cv*su, sv);
41 builder.texcoord(j*u_scale, i*v_scale);
44 builder.tangent(-su, cu, 0);
45 builder.binormal(-sv*cu, -sv*su, cv);
47 builder.vertex(cv*cu*radius, cv*su*radius, sv*radius);
51 builder.begin(TRIANGLES);
52 for(unsigned j=0; j<segments; ++j)
55 builder.element(segments+2+j);
56 builder.element(segments+1+j);
58 unsigned top = (rings+1)*(segments+1)-1;
59 for(unsigned j=0; j<segments; ++j)
61 builder.element(top-j);
62 builder.element(top-(segments+2+j));
63 builder.element(top-(segments+1+j));
67 for(unsigned i=1; i<rings; ++i)
69 builder.begin(TRIANGLE_STRIP);
70 unsigned base = i*(segments+1);
71 for(unsigned j=0; j<=segments; ++j)
73 builder.element(base+segments+1+j);
74 builder.element(base+j);