tavli

annotate src/board.cc @ 9:8a167149985d

unused var
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 26 Jun 2015 05:34:01 +0300
parents 464c45a0bc24
children a8e26f163f99
rev   line source
nuclear@0 1 #include "opengl.h"
nuclear@0 2 #include "board.h"
nuclear@1 3 #include "meshgen.h"
nuclear@6 4 #include "pnoise.h"
nuclear@0 5
nuclear@0 6 Board::Board()
nuclear@0 7 {
nuclear@2 8 puck_obj = 0;
nuclear@0 9 clear();
nuclear@0 10 }
nuclear@0 11
nuclear@0 12 Board::~Board()
nuclear@0 13 {
nuclear@0 14 destroy();
nuclear@0 15 }
nuclear@0 16
nuclear@0 17 bool Board::init()
nuclear@0 18 {
nuclear@4 19 if(!generate_textures()) {
nuclear@4 20 return false;
nuclear@4 21 }
nuclear@1 22 if(!generate()) {
nuclear@0 23 return false;
nuclear@0 24 }
nuclear@1 25
nuclear@0 26 return true;
nuclear@0 27 }
nuclear@0 28
nuclear@0 29 void Board::destroy()
nuclear@0 30 {
nuclear@2 31 for(size_t i=0; i<obj.size(); i++) {
nuclear@2 32 delete obj[i];
nuclear@1 33 }
nuclear@2 34 obj.clear();
nuclear@1 35
nuclear@2 36 delete puck_obj;
nuclear@2 37 puck_obj = 0;
nuclear@0 38 }
nuclear@0 39
nuclear@0 40 void Board::clear()
nuclear@0 41 {
nuclear@0 42 memset(slots, 0, sizeof slots);
nuclear@0 43 }
nuclear@0 44
nuclear@0 45 void Board::draw() const
nuclear@0 46 {
nuclear@2 47 for(size_t i=0; i<obj.size(); i++) {
nuclear@2 48 obj[i]->draw();
nuclear@1 49 }
nuclear@0 50 }
nuclear@0 51
nuclear@1 52 #define HSIZE 1.0
nuclear@1 53 #define VSIZE (2.0 * HSIZE)
nuclear@1 54 #define BOT_THICKNESS (HSIZE * 0.01)
nuclear@1 55 #define WALL_THICKNESS (HSIZE * 0.05)
nuclear@1 56 #define WALL_HEIGHT (HSIZE * 0.1)
nuclear@1 57 #define GAP (HSIZE * 0.025)
nuclear@1 58 #define HINGE_RAD (GAP * 0.5)
nuclear@1 59 #define HINGE_HEIGHT (VSIZE * 0.075)
nuclear@1 60
nuclear@1 61 bool Board::generate()
nuclear@0 62 {
nuclear@4 63 Mesh tmp;
nuclear@1 64 Matrix4x4 xform;
nuclear@1 65
nuclear@2 66 obj.clear();
nuclear@2 67
nuclear@4 68 for(int i=0; i<2; i++) {
nuclear@4 69 int sign = i * 2 - 1;
nuclear@1 70
nuclear@4 71 // generate bottom
nuclear@4 72 Mesh *bottom = new Mesh;
nuclear@4 73 gen_box(bottom, HSIZE, BOT_THICKNESS, HSIZE * 2.0);
nuclear@4 74 xform.set_translation(Vector3(0, -BOT_THICKNESS / 2.0, 0));
nuclear@4 75 bottom->apply_xform(xform);
nuclear@2 76
nuclear@4 77 Object *obottom = new Object;
nuclear@4 78 obottom->set_mesh(bottom);
nuclear@4 79 obottom->xform().set_translation(Vector3(sign * (HSIZE / 2.0 + WALL_THICKNESS + HINGE_RAD * 0.25), 0, 0));
nuclear@4 80 obottom->set_texture(img_field.texture());
nuclear@4 81 obj.push_back(obottom);
nuclear@2 82
nuclear@1 83
nuclear@4 84 // generate the 4 sides
nuclear@4 85 Mesh *sides = new Mesh;
nuclear@4 86 gen_box(sides, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2);
nuclear@4 87 xform.set_translation(Vector3(-(HSIZE + WALL_THICKNESS) / 2.0,
nuclear@4 88 WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0));
nuclear@4 89 sides->apply_xform(xform);
nuclear@1 90
nuclear@4 91 gen_box(&tmp, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2);
nuclear@4 92 xform.set_translation(Vector3((HSIZE + WALL_THICKNESS) / 2.0,
nuclear@4 93 WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0));
nuclear@4 94 tmp.apply_xform(xform);
nuclear@4 95 sides->append(tmp);
nuclear@4 96 tmp.clear();
nuclear@1 97
nuclear@4 98 gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS);
nuclear@4 99 xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS,
nuclear@4 100 (VSIZE + WALL_THICKNESS) / 2.0));
nuclear@4 101 tmp.apply_xform(xform);
nuclear@4 102 sides->append(tmp);
nuclear@4 103 tmp.clear();
nuclear@1 104
nuclear@4 105 gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS);
nuclear@4 106 xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS,
nuclear@4 107 -(VSIZE + WALL_THICKNESS) / 2.0));
nuclear@4 108 tmp.apply_xform(xform);
nuclear@4 109 sides->append(tmp);
nuclear@4 110 tmp.clear();
nuclear@4 111
nuclear@6 112 // generate texture coordinates
nuclear@6 113 sides->texcoord_gen_box();
nuclear@6 114
nuclear@4 115 Object *osides = new Object;
nuclear@4 116 osides->set_mesh(sides);
nuclear@4 117 osides->xform() = obottom->xform();
nuclear@6 118 osides->set_texture(img_wood.texture());
nuclear@6 119 osides->tex_xform().set_scaling(Vector3(2, 2, 2));
nuclear@6 120 osides->tex_xform().rotate(-Vector3(1, 0, 0.5), M_PI / 4.0);
nuclear@4 121 obj.push_back(osides);
nuclear@4 122
nuclear@4 123 }
nuclear@2 124
nuclear@2 125
nuclear@1 126 // generate the hinges
nuclear@1 127 Mesh *hinges = new Mesh;
nuclear@7 128 for(int i=0; i<2; i++) {
nuclear@7 129 float sign = i * 2 - 1;
nuclear@1 130
nuclear@7 131 // barrel
nuclear@7 132 gen_cylinder(&tmp, HINGE_RAD, HINGE_HEIGHT, 10, 1, 1);
nuclear@7 133 xform.reset_identity();
nuclear@7 134 xform.translate(Vector3(0, WALL_HEIGHT - HINGE_RAD * 0.5, sign * VSIZE / 4.0));
nuclear@7 135 xform.rotate(Vector3(-M_PI / 2.0, 0, 0));
nuclear@7 136 tmp.apply_xform(xform);
nuclear@7 137 hinges->append(tmp);
nuclear@1 138
nuclear@7 139 // flange
nuclear@7 140 gen_plane(&tmp, HINGE_HEIGHT * 0.6, HINGE_HEIGHT * 0.8);
nuclear@7 141 tmp.apply_xform(xform);
nuclear@7 142
nuclear@7 143 Matrix4x4 tex_xform;
nuclear@7 144 tex_xform.set_rotation(Vector3(0, 0, M_PI / 2.0));
nuclear@7 145 tmp.texcoord_apply_xform(tex_xform);
nuclear@7 146 hinges->append(tmp);
nuclear@7 147
nuclear@7 148 // studs
nuclear@7 149 for(int j=0; j<4; j++) {
nuclear@7 150 Vector3 pos;
nuclear@7 151
nuclear@7 152 pos.x = (float)((j & 1) * 2 - 1) * HINGE_HEIGHT * 0.2;
nuclear@7 153 pos.y = (float)((j & 2) - 1) * HINGE_HEIGHT * 0.3;
nuclear@7 154
nuclear@7 155 Matrix4x4 stud_xform = xform;
nuclear@7 156 stud_xform.translate(pos);
nuclear@7 157
nuclear@7 158 Matrix4x4 squash;
nuclear@7 159 squash.set_scaling(Vector3(1, 1, 0.5));
nuclear@7 160
nuclear@7 161 gen_sphere(&tmp, HINGE_RAD * 0.5, 8, 4);
nuclear@7 162 tmp.apply_xform(stud_xform * squash);
nuclear@7 163 hinges->append(tmp);
nuclear@7 164 }
nuclear@7 165 }
nuclear@1 166
nuclear@2 167 Object *ohinges = new Object;
nuclear@2 168 ohinges->set_mesh(hinges);
nuclear@7 169 ohinges->set_texture(img_hinge.texture());
nuclear@2 170 obj.push_back(ohinges);
nuclear@1 171
nuclear@6 172 // debug object
nuclear@7 173 /*
nuclear@7 174 Mesh *dbgmesh = new Mesh;
nuclear@6 175 gen_box(dbgmesh, 0.5, 0.5, 0.5);
nuclear@6 176 xform.set_translation(Vector3(0, 0.4, 0));
nuclear@7 177 xform.set_scaling(Vector3(1, 1, 1));
nuclear@6 178 dbgmesh->apply_xform(xform);
nuclear@6 179 Object *dbgobj = new Object;
nuclear@6 180 dbgobj->set_mesh(dbgmesh);
nuclear@7 181 dbgobj->set_texture(img_hinge.texture());
nuclear@7 182 //dbgobj->tex_xform().set_scaling(Vector3(3, 3, 3));
nuclear@7 183 obj.push_back(dbgobj);
nuclear@7 184 */
nuclear@2 185
nuclear@8 186 // meshgen stats
nuclear@8 187 printf("Generated board:\n %u meshes\n", (unsigned int)obj.size());
nuclear@8 188 unsigned int polycount = 0;
nuclear@8 189 for(size_t i=0; i<obj.size(); i++) {
nuclear@8 190 const Mesh *m = obj[i]->get_mesh();
nuclear@8 191 polycount += m->get_poly_count();
nuclear@8 192 }
nuclear@8 193 printf(" %u polygons\n", polycount);
nuclear@8 194
nuclear@1 195 return true;
nuclear@0 196 }
nuclear@4 197
nuclear@5 198 static float wood(float x, float y)
nuclear@5 199 {
nuclear@5 200 float u = x;
nuclear@5 201 float v = y;
nuclear@5 202 x += 1.0;
nuclear@5 203 x *= 10.0;
nuclear@5 204 y *= 20.0;
nuclear@5 205
nuclear@5 206 float len = sqrt(x * x + y * y) + turbulence2(u * 6.0, v * 12.0, 2) * 1.2 +
nuclear@5 207 turbulence2(u * 0.5, v, 2) * 15.0;
nuclear@5 208 float val = fmod(len, 1.0);
nuclear@5 209
nuclear@5 210 //val = val * 0.5 + 0.5;
nuclear@5 211 return val < 0.0 ? 0.0 : (val > 1.0 ? 1.0 : val);
nuclear@5 212 }
nuclear@5 213
nuclear@6 214 static float wood_tile(float x, float y)
nuclear@6 215 {
nuclear@6 216 float u = x;
nuclear@6 217 float v = y;
nuclear@6 218 x *= 10.0;
nuclear@6 219 y *= 10.0;
nuclear@6 220
nuclear@6 221 float val = x + pnoise2(u * 6.0, v, 6, 1) * 3.0 +
nuclear@6 222 pturbulence2(u * 4, v * 2, 4, 2, 2) * 1.5 + pturbulence2(u * 8, v * 8, 8, 8, 2) * 0.5;
nuclear@6 223
nuclear@6 224 val = fmod(val, 1.0);
nuclear@6 225 return val < 0.0 ? 0.0 : (val > 1.0 ? 1.0 : val);
nuclear@6 226 }
nuclear@6 227
nuclear@4 228 static bool spike(float x, float y)
nuclear@4 229 {
nuclear@4 230 x = fmod(x * 5.0, 1.0);
nuclear@4 231 return y < (x < 0.5 ? 2.0 * x : 2.0 - 2.0 * x);
nuclear@4 232 }
nuclear@4 233
nuclear@4 234 static bool circle(float x, float y, float rad)
nuclear@4 235 {
nuclear@4 236 x = fmod(x * 5.0, 1.0) - 0.5;
nuclear@4 237 y = (y - 0.65) * 5.0;
nuclear@4 238 float len = sqrt(x * x + y * y);
nuclear@4 239 return len < rad;
nuclear@4 240 }
nuclear@4 241
nuclear@4 242 static bool diamond(float x, float y)
nuclear@4 243 {
nuclear@4 244 return y >= (1.0 - (x < 0.5 ? 2.0 * x : 2.0 - 2.0 * x)) * 0.3333333 + 0.88;
nuclear@4 245 }
nuclear@4 246
nuclear@4 247 static bool center_circle(float x, float y, float rad)
nuclear@4 248 {
nuclear@4 249 x = x - 0.5;
nuclear@4 250 y = 1.0 - y;
nuclear@4 251 return sqrt(x * x + y * y) < rad;
nuclear@4 252 }
nuclear@4 253
nuclear@4 254 bool Board::generate_textures()
nuclear@4 255 {
nuclear@6 256 // ---- board field texture ----
nuclear@5 257 static const Vector3 wcol1 = Vector3(0.6, 0.4, 0.2);
nuclear@6 258 static const Vector3 wcol2 = Vector3(0.53, 0.32, 0.1);
nuclear@6 259 static const Vector3 wcol3 = Vector3(0.38, 0.25, 0.08);
nuclear@5 260
nuclear@8 261 img_field.create(1024, 1024);
nuclear@6 262 unsigned char *pptr = img_field.pixels;
nuclear@6 263 for(int i=0; i<img_field.height; i++) {
nuclear@6 264 float v = (float)i / (float)img_field.height;
nuclear@4 265
nuclear@6 266 for(int j=0; j<img_field.width; j++) {
nuclear@6 267 float u = (float)j / (float)img_field.width;
nuclear@4 268
nuclear@4 269 int r = 0, g = 0, b = 0;
nuclear@4 270
nuclear@5 271 float wood_val = wood(u, v);
nuclear@5 272
nuclear@5 273 // pattern mask
nuclear@4 274 float x = u;
nuclear@4 275 float y = v < 0.5 ? v * 2.0 : 2.0 - v * 2.0;
nuclear@4 276 bool inside = false;
nuclear@4 277
nuclear@4 278 inside |= (spike(x, y + 0.33333) && !spike(x, y + 0.4)) ||
nuclear@4 279 (spike(x, y + 0.5) && !spike(x, y + 0.68));
nuclear@4 280 inside |= (circle(x, y, 0.12) && !circle(x, y, 0.1)) || circle(x, y, 0.06);
nuclear@4 281 inside |= (diamond(x, y) && !diamond(x, y - 0.015)) ||
nuclear@4 282 (diamond(x, y - 0.023) && !diamond(x, y - 0.028));
nuclear@4 283 inside |= center_circle(x, y, 0.03);
nuclear@4 284
nuclear@5 285 Vector3 wood_color = lerp(wcol1, wcol2, wood_val) * 0.9;
nuclear@4 286 if(inside) {
nuclear@5 287 wood_color = lerp(wcol1, wcol2, 1.0 - wood_val) * 2.0;
nuclear@4 288 }
nuclear@4 289
nuclear@5 290 r = (int)(wood_color.x * 255.0);
nuclear@5 291 g = (int)(wood_color.y * 255.0);
nuclear@5 292 b = (int)(wood_color.z * 255.0);
nuclear@5 293
nuclear@5 294 pptr[0] = r > 255 ? 255 : r;
nuclear@5 295 pptr[1] = g > 255 ? 255 : g;
nuclear@5 296 pptr[2] = b > 255 ? 255 : b;
nuclear@4 297 pptr += 3;
nuclear@4 298 }
nuclear@4 299 }
nuclear@6 300 img_field.texture();
nuclear@4 301
nuclear@6 302 // ---- generic wood texture ----
nuclear@6 303 img_wood.create(256, 256);
nuclear@6 304 pptr = img_wood.pixels;
nuclear@6 305 for(int i=0; i<img_wood.height; i++) {
nuclear@6 306 float v = (float)i / (float)img_wood.height;
nuclear@6 307 for(int j=0; j<img_wood.width; j++) {
nuclear@6 308 float u = (float)j / (float)img_wood.width;
nuclear@6 309
nuclear@6 310 float wood_val = wood_tile(u, v);
nuclear@6 311 Vector3 wood_color = lerp(wcol2, wcol3, wood_val) * 0.7;
nuclear@6 312
nuclear@6 313 int r = (int)(wood_color.x * 255.0);
nuclear@6 314 int g = (int)(wood_color.y * 255.0);
nuclear@6 315 int b = (int)(wood_color.z * 255.0);
nuclear@6 316
nuclear@6 317 pptr[0] = r > 255 ? 255 : r;
nuclear@6 318 pptr[1] = g > 255 ? 255 : g;
nuclear@6 319 pptr[2] = b > 255 ? 255 : b;
nuclear@6 320 pptr += 3;
nuclear@6 321 }
nuclear@6 322 }
nuclear@6 323 img_wood.texture();
nuclear@7 324
nuclear@7 325 // ---- metal hinge diffuse texture ----
nuclear@7 326 Vector3 rusty_col1 = Vector3(0.43, 0.46, 0.52);
nuclear@7 327 Vector3 rusty_col2 = Vector3(0.52, 0.47, 0.43);
nuclear@7 328
nuclear@7 329 img_hinge.create(128, 128);
nuclear@7 330 pptr = img_hinge.pixels;
nuclear@7 331 for(int i=0; i<img_hinge.height; i++) {
nuclear@7 332 float v = (float)i / (float)img_hinge.height;
nuclear@7 333 for(int j=0; j<img_hinge.width; j++) {
nuclear@7 334 float u = (float)j / (float)img_hinge.width;
nuclear@7 335
nuclear@7 336 // rust pattern
nuclear@7 337 float w1 = fbm2(u * 4.0, v * 4.0, 3) * 0.5 + 0.5;
nuclear@9 338 //float w2 = fbm2(u * 8.0, v * 8.0, 1) * 0.5 + 0.5;
nuclear@7 339 Vector3 col = lerp(rusty_col1, rusty_col2 * 0.5, w1);
nuclear@7 340
nuclear@7 341 // center hinge split
nuclear@7 342 if(fabs(v - 0.5) < 0.01) {
nuclear@7 343 col *= 0.5;
nuclear@7 344 }
nuclear@7 345
nuclear@7 346 int r = (int)(col.x * 255.0);
nuclear@7 347 int g = (int)(col.y * 255.0);
nuclear@7 348 int b = (int)(col.z * 255.0);
nuclear@7 349
nuclear@7 350 pptr[0] = r > 255 ? 255 : (r < 0 ? 0 : r);
nuclear@7 351 pptr[1] = g > 255 ? 255 : (g < 0 ? 0 : g);
nuclear@7 352 pptr[2] = b > 255 ? 255 : (b < 0 ? 0 : b);
nuclear@7 353
nuclear@7 354 pptr += 3;
nuclear@7 355 }
nuclear@7 356 }
nuclear@7 357 img_hinge.texture();
nuclear@7 358
nuclear@4 359 return true;
nuclear@4 360 }