rayzor
diff src/object.cc @ 9:70e332156d02
moving along
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 10 Apr 2014 02:31:31 +0300 |
parents | a68dbf80d547 |
children | d94a69933a71 |
line diff
1.1 --- a/src/object.cc Mon Apr 07 08:46:06 2014 +0300 1.2 +++ b/src/object.cc Thu Apr 10 02:31:31 2014 +0300 1.3 @@ -1,6 +1,7 @@ 1.4 #include "object.h" 1.5 #include "vmath.h" 1.6 #include "min3d.h" 1.7 +#include "logger.h" 1.8 1.9 Object::Object() 1.10 { 1.11 @@ -19,37 +20,60 @@ 1.12 { 1.13 } 1.14 1.15 -#define USUB 32 1.16 -#define VSUB 16 1.17 +#define USUB 12 1.18 +#define VSUB 6 1.19 1.20 void Sphere::draw() const 1.21 { 1.22 static Vector3 *varr; 1.23 - static int num_verts; 1.24 + static unsigned int *iarr; 1.25 + static int num_verts, num_indices; 1.26 if(!varr) { 1.27 + int i, j; 1.28 int uverts = USUB; 1.29 int vverts = VSUB + 1; 1.30 + 1.31 num_verts = uverts * vverts; 1.32 varr = new Vector3[num_verts]; 1.33 1.34 Vector3 *vptr = varr; 1.35 - for(int i=0; i<uverts; i++) { 1.36 - float u = (float)i / (float)USUB; 1.37 - float theta = u * M_PI * 2.0; 1.38 - for(int j=0; j<vverts; j++) { 1.39 - float v = (float)j / (float)VSUB; 1.40 - float phi = (v - 0.5) * M_PI; 1.41 + for(i=0; i<vverts; i++) { 1.42 + float v = (float)i / (float)VSUB; 1.43 + float phi = v * M_PI; 1.44 + for(j=0; j<uverts; j++) { 1.45 + float u = (float)j / (float)uverts; 1.46 + float theta = u * M_PI * 2.0; 1.47 1.48 - float x = sin(theta) * cos(phi); 1.49 - float y = sin(phi); 1.50 - float z = cos(theta) * cos(phi); 1.51 + float x = sin(theta) * sin(phi); 1.52 + float y = cos(phi); 1.53 + float z = cos(theta) * sin(phi); 1.54 1.55 *vptr++ = Vector3(x, y, z); 1.56 } 1.57 } 1.58 + 1.59 + num_indices = USUB * VSUB * 4; 1.60 + iarr = new unsigned int[num_indices]; 1.61 + 1.62 + unsigned int *iptr = iarr; 1.63 + for(i=0; i<VSUB; i++) { 1.64 + for(j=0; j<USUB; j++) { 1.65 + iptr[0] = i * uverts + j; 1.66 + iptr[1] = i * uverts + ((j + 1) % uverts); 1.67 + iptr[2] = iptr[1] + uverts; 1.68 + iptr[3] = iptr[0] + uverts; 1.69 + iptr += 4; 1.70 + } 1.71 + } 1.72 + 1.73 + printlog("created sphere mesh\n"); 1.74 + printlog(" vertices: %d (%d slices, %d stacks)\n", num_verts, uverts, vverts); 1.75 + printlog(" quads: %d (%d indices, %d usub, %d vsub)\n", USUB * VSUB, num_indices, USUB, VSUB); 1.76 } 1.77 1.78 + m3d_color(1, 1, 1); 1.79 + 1.80 m3d_vertex_array(&varr->x); 1.81 - m3d_draw(M3D_POINTS, num_verts); 1.82 + m3d_draw_indexed(M3D_QUADS, iarr, num_indices); 1.83 m3d_vertex_array(0); 1.84 }