rayzor

annotate src/object.cc @ 12:d94a69933a71

lots of stuff, can't remember
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 12 Apr 2014 23:28:24 +0300
parents 70e332156d02
children a9a948809c6f
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 }