rev |
line source |
nuclear@1
|
1 #include "object.h"
|
nuclear@1
|
2 #include "vmath.h"
|
nuclear@1
|
3 #include "min3d.h"
|
nuclear@9
|
4 #include "logger.h"
|
nuclear@1
|
5
|
nuclear@1
|
6 Object::Object()
|
nuclear@1
|
7 {
|
nuclear@12
|
8 type = NODE_OBJECT;
|
nuclear@1
|
9 }
|
nuclear@1
|
10
|
nuclear@1
|
11 Object::~Object()
|
nuclear@1
|
12 {
|
nuclear@1
|
13 }
|
nuclear@1
|
14
|
nuclear@12
|
15 void Object::pre_draw() const
|
nuclear@12
|
16 {
|
nuclear@12
|
17 m3d_matrix_mode(M3D_MODELVIEW);
|
nuclear@12
|
18 m3d_push_matrix();
|
nuclear@12
|
19 m3d_mult_matrix(get_matrix()[0]);
|
nuclear@12
|
20 }
|
nuclear@12
|
21
|
nuclear@12
|
22 void Object::post_draw() const
|
nuclear@12
|
23 {
|
nuclear@12
|
24 m3d_pop_matrix();
|
nuclear@12
|
25 }
|
nuclear@12
|
26
|
nuclear@1
|
27 // ---- sphere ----
|
nuclear@1
|
28 Sphere::Sphere()
|
nuclear@1
|
29 {
|
nuclear@1
|
30 }
|
nuclear@1
|
31
|
nuclear@1
|
32 Sphere::~Sphere()
|
nuclear@1
|
33 {
|
nuclear@1
|
34 }
|
nuclear@1
|
35
|
nuclear@9
|
36 #define USUB 12
|
nuclear@9
|
37 #define VSUB 6
|
nuclear@1
|
38
|
nuclear@1
|
39 void Sphere::draw() const
|
nuclear@1
|
40 {
|
nuclear@1
|
41 static Vector3 *varr;
|
nuclear@9
|
42 static unsigned int *iarr;
|
nuclear@9
|
43 static int num_verts, num_indices;
|
nuclear@1
|
44 if(!varr) {
|
nuclear@9
|
45 int i, j;
|
nuclear@1
|
46 int uverts = USUB;
|
nuclear@1
|
47 int vverts = VSUB + 1;
|
nuclear@9
|
48
|
nuclear@1
|
49 num_verts = uverts * vverts;
|
nuclear@1
|
50 varr = new Vector3[num_verts];
|
nuclear@1
|
51
|
nuclear@1
|
52 Vector3 *vptr = varr;
|
nuclear@9
|
53 for(i=0; i<vverts; i++) {
|
nuclear@9
|
54 float v = (float)i / (float)VSUB;
|
nuclear@9
|
55 float phi = v * M_PI;
|
nuclear@9
|
56 for(j=0; j<uverts; j++) {
|
nuclear@9
|
57 float u = (float)j / (float)uverts;
|
nuclear@9
|
58 float theta = u * M_PI * 2.0;
|
nuclear@1
|
59
|
nuclear@9
|
60 float x = sin(theta) * sin(phi);
|
nuclear@12
|
61 float y = -cos(phi);
|
nuclear@9
|
62 float z = cos(theta) * sin(phi);
|
nuclear@1
|
63
|
nuclear@1
|
64 *vptr++ = Vector3(x, y, z);
|
nuclear@1
|
65 }
|
nuclear@1
|
66 }
|
nuclear@9
|
67
|
nuclear@9
|
68 num_indices = USUB * VSUB * 4;
|
nuclear@9
|
69 iarr = new unsigned int[num_indices];
|
nuclear@9
|
70
|
nuclear@9
|
71 unsigned int *iptr = iarr;
|
nuclear@9
|
72 for(i=0; i<VSUB; i++) {
|
nuclear@9
|
73 for(j=0; j<USUB; j++) {
|
nuclear@9
|
74 iptr[0] = i * uverts + j;
|
nuclear@9
|
75 iptr[1] = i * uverts + ((j + 1) % uverts);
|
nuclear@9
|
76 iptr[2] = iptr[1] + uverts;
|
nuclear@9
|
77 iptr[3] = iptr[0] + uverts;
|
nuclear@9
|
78 iptr += 4;
|
nuclear@9
|
79 }
|
nuclear@9
|
80 }
|
nuclear@9
|
81
|
nuclear@9
|
82 printlog("created sphere mesh\n");
|
nuclear@9
|
83 printlog(" vertices: %d (%d slices, %d stacks)\n", num_verts, uverts, vverts);
|
nuclear@9
|
84 printlog(" quads: %d (%d indices, %d usub, %d vsub)\n", USUB * VSUB, num_indices, USUB, VSUB);
|
nuclear@1
|
85 }
|
nuclear@1
|
86
|
nuclear@12
|
87 pre_draw();
|
nuclear@9
|
88
|
nuclear@5
|
89 m3d_vertex_array(&varr->x);
|
nuclear@9
|
90 m3d_draw_indexed(M3D_QUADS, iarr, num_indices);
|
nuclear@5
|
91 m3d_vertex_array(0);
|
nuclear@12
|
92
|
nuclear@12
|
93 post_draw();
|
nuclear@1
|
94 }
|
nuclear@12
|
95
|
nuclear@12
|
96 bool Sphere::intersect(const Ray &ray, float *dist) const
|
nuclear@12
|
97 {
|
nuclear@12
|
98 return false; // TODO
|
nuclear@12
|
99 }
|
nuclear@12
|
100
|
nuclear@12
|
101 // ---- box ----
|
nuclear@12
|
102
|
nuclear@12
|
103 Box::Box()
|
nuclear@12
|
104 {
|
nuclear@12
|
105 }
|
nuclear@12
|
106
|
nuclear@12
|
107 Box::~Box()
|
nuclear@12
|
108 {
|
nuclear@12
|
109 }
|
nuclear@12
|
110
|
nuclear@12
|
111 /*
|
nuclear@12
|
112 3--------2
|
nuclear@12
|
113 /. .\
|
nuclear@12
|
114 0------------1
|
nuclear@12
|
115 | 7--------6 |
|
nuclear@12
|
116 |/ \|
|
nuclear@12
|
117 4------------5
|
nuclear@12
|
118
|
nuclear@12
|
119 */
|
nuclear@12
|
120 void Box::draw() const
|
nuclear@12
|
121 {
|
nuclear@12
|
122 static const float verts[] = {
|
nuclear@12
|
123 -1, 1, 1,
|
nuclear@12
|
124 1, 1, 1,
|
nuclear@12
|
125 1, 1, -1,
|
nuclear@12
|
126 -1, 1, -1,
|
nuclear@12
|
127 -1, -1, 1,
|
nuclear@12
|
128 1, -1, 1,
|
nuclear@12
|
129 1, -1, -1,
|
nuclear@12
|
130 -1, -1, -1
|
nuclear@12
|
131 };
|
nuclear@12
|
132 static const unsigned int indices[] = {
|
nuclear@12
|
133 0, 1, 2, 3, // top
|
nuclear@12
|
134 4, 7, 6, 5, // bottom
|
nuclear@12
|
135 0, 4, 5, 1, // front
|
nuclear@12
|
136 5, 6, 2, 1, // right
|
nuclear@12
|
137 6, 7, 3, 2, // back
|
nuclear@12
|
138 7, 4, 0, 3 // left
|
nuclear@12
|
139 };
|
nuclear@12
|
140
|
nuclear@12
|
141 pre_draw();
|
nuclear@12
|
142
|
nuclear@12
|
143 m3d_vertex_array(verts);
|
nuclear@12
|
144 m3d_draw_indexed(M3D_QUADS, indices, sizeof indices / sizeof *indices);
|
nuclear@12
|
145 m3d_vertex_array(0);
|
nuclear@12
|
146
|
nuclear@12
|
147 post_draw();
|
nuclear@12
|
148 }
|
nuclear@12
|
149
|
nuclear@12
|
150 bool Box::intersect(const Ray &ray, float *dist) const
|
nuclear@12
|
151 {
|
nuclear@12
|
152 return false; // TODO
|
nuclear@12
|
153 }
|