tavli

annotate src/board.cc @ 2:893192aea099

board keeps objects instead of raw meshes
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 22 Jun 2015 05:15:39 +0300
parents 3fcd7b4d631f
children b41ceead1708
rev   line source
nuclear@0 1 #include "opengl.h"
nuclear@0 2 #include "board.h"
nuclear@1 3 #include "meshgen.h"
nuclear@0 4
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@1 19 if(!generate()) {
nuclear@0 20 return false;
nuclear@0 21 }
nuclear@1 22
nuclear@0 23 return true;
nuclear@0 24 }
nuclear@0 25
nuclear@0 26 void Board::destroy()
nuclear@0 27 {
nuclear@2 28 for(size_t i=0; i<obj.size(); i++) {
nuclear@2 29 delete obj[i];
nuclear@1 30 }
nuclear@2 31 obj.clear();
nuclear@1 32
nuclear@2 33 delete puck_obj;
nuclear@2 34 puck_obj = 0;
nuclear@0 35 }
nuclear@0 36
nuclear@0 37 void Board::clear()
nuclear@0 38 {
nuclear@0 39 memset(slots, 0, sizeof slots);
nuclear@0 40 }
nuclear@0 41
nuclear@0 42 void Board::draw() const
nuclear@0 43 {
nuclear@2 44 for(size_t i=0; i<obj.size(); i++) {
nuclear@2 45 obj[i]->draw();
nuclear@1 46 }
nuclear@0 47 }
nuclear@0 48
nuclear@1 49 #define HSIZE 1.0
nuclear@1 50 #define VSIZE (2.0 * HSIZE)
nuclear@1 51 #define BOT_THICKNESS (HSIZE * 0.01)
nuclear@1 52 #define WALL_THICKNESS (HSIZE * 0.05)
nuclear@1 53 #define WALL_HEIGHT (HSIZE * 0.1)
nuclear@1 54 #define GAP (HSIZE * 0.025)
nuclear@1 55 #define HINGE_RAD (GAP * 0.5)
nuclear@1 56 #define HINGE_HEIGHT (VSIZE * 0.075)
nuclear@1 57
nuclear@1 58 bool Board::generate()
nuclear@0 59 {
nuclear@1 60 Matrix4x4 xform;
nuclear@1 61
nuclear@2 62 obj.clear();
nuclear@2 63
nuclear@1 64 // generate bottom
nuclear@1 65 Mesh *bottom = new Mesh;
nuclear@1 66 gen_box(bottom, HSIZE, BOT_THICKNESS, HSIZE * 2.0);
nuclear@1 67 xform.set_translation(Vector3(0, -BOT_THICKNESS / 2.0, 0));
nuclear@1 68 bottom->apply_xform(xform);
nuclear@1 69
nuclear@2 70 Object *obottom = new Object;
nuclear@2 71 obottom->set_mesh(bottom);
nuclear@2 72 obj.push_back(obottom);
nuclear@2 73
nuclear@2 74
nuclear@1 75 // generate the 4 sides
nuclear@1 76 Mesh *sides = new Mesh;
nuclear@1 77 gen_box(sides, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2);
nuclear@1 78 xform.set_translation(Vector3(-(HSIZE + WALL_THICKNESS) / 2.0,
nuclear@1 79 WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0));
nuclear@1 80 sides->apply_xform(xform);
nuclear@1 81
nuclear@1 82 Mesh tmp;
nuclear@1 83 gen_box(&tmp, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2);
nuclear@1 84 xform.set_translation(Vector3((HSIZE + WALL_THICKNESS) / 2.0,
nuclear@1 85 WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0));
nuclear@1 86 tmp.apply_xform(xform);
nuclear@1 87 sides->append(tmp);
nuclear@1 88 tmp.clear();
nuclear@1 89
nuclear@1 90 gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS);
nuclear@1 91 xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS,
nuclear@1 92 (VSIZE + WALL_THICKNESS) / 2.0));
nuclear@1 93 tmp.apply_xform(xform);
nuclear@1 94 sides->append(tmp);
nuclear@1 95 tmp.clear();
nuclear@1 96
nuclear@1 97 gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS);
nuclear@1 98 xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS,
nuclear@1 99 -(VSIZE + WALL_THICKNESS) / 2.0));
nuclear@1 100 tmp.apply_xform(xform);
nuclear@1 101 sides->append(tmp);
nuclear@1 102 tmp.clear();
nuclear@1 103
nuclear@2 104 Object *osides = new Object;
nuclear@2 105 osides->set_mesh(sides);
nuclear@2 106 obj.push_back(osides);
nuclear@2 107
nuclear@2 108
nuclear@1 109 // generate the hinges
nuclear@1 110 Mesh *hinges = new Mesh;
nuclear@1 111 gen_cylinder(hinges, HINGE_RAD, HINGE_HEIGHT, 10, 1, 1);
nuclear@1 112 xform.set_rotation(Vector3(M_PI / 2.0, 0, 0));
nuclear@1 113 xform.translate(Vector3(0, VSIZE / 4.0, 0));
nuclear@1 114 hinges->apply_xform(xform);
nuclear@1 115
nuclear@1 116 gen_cylinder(&tmp, HINGE_RAD, HINGE_HEIGHT, 10, 1, 1);
nuclear@1 117 xform.set_rotation(Vector3(M_PI / 2.0, 0, 0));
nuclear@1 118 xform.translate(Vector3(0, -VSIZE / 4.0, 0));
nuclear@1 119 tmp.apply_xform(xform);
nuclear@1 120
nuclear@1 121 hinges->append(tmp);
nuclear@1 122
nuclear@2 123 Object *ohinges = new Object;
nuclear@2 124 ohinges->set_mesh(hinges);
nuclear@2 125 obj.push_back(ohinges);
nuclear@1 126
nuclear@2 127
nuclear@1 128 return true;
nuclear@0 129 }