nuclear@0: #include "opengl.h" nuclear@0: #include "board.h" nuclear@1: #include "meshgen.h" nuclear@0: nuclear@0: nuclear@0: Board::Board() nuclear@0: { nuclear@1: puck_mesh = 0; nuclear@0: clear(); nuclear@0: } nuclear@0: nuclear@0: Board::~Board() nuclear@0: { nuclear@0: destroy(); nuclear@0: } nuclear@0: nuclear@0: bool Board::init() nuclear@0: { nuclear@1: if(!generate()) { nuclear@0: return false; nuclear@0: } nuclear@1: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: void Board::destroy() nuclear@0: { nuclear@1: for(size_t i=0; idraw(); nuclear@1: } nuclear@0: } nuclear@0: nuclear@1: #define HSIZE 1.0 nuclear@1: #define VSIZE (2.0 * HSIZE) nuclear@1: #define BOT_THICKNESS (HSIZE * 0.01) nuclear@1: #define WALL_THICKNESS (HSIZE * 0.05) nuclear@1: #define WALL_HEIGHT (HSIZE * 0.1) nuclear@1: #define GAP (HSIZE * 0.025) nuclear@1: #define HINGE_RAD (GAP * 0.5) nuclear@1: #define HINGE_HEIGHT (VSIZE * 0.075) nuclear@1: nuclear@1: bool Board::generate() nuclear@0: { nuclear@1: Matrix4x4 xform; nuclear@1: nuclear@1: // generate bottom nuclear@1: Mesh *bottom = new Mesh; nuclear@1: gen_box(bottom, HSIZE, BOT_THICKNESS, HSIZE * 2.0); nuclear@1: xform.set_translation(Vector3(0, -BOT_THICKNESS / 2.0, 0)); nuclear@1: bottom->apply_xform(xform); nuclear@1: nuclear@1: // generate the 4 sides nuclear@1: Mesh *sides = new Mesh; nuclear@1: gen_box(sides, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2); nuclear@1: xform.set_translation(Vector3(-(HSIZE + WALL_THICKNESS) / 2.0, nuclear@1: WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0)); nuclear@1: sides->apply_xform(xform); nuclear@1: nuclear@1: Mesh tmp; nuclear@1: gen_box(&tmp, WALL_THICKNESS, WALL_HEIGHT, VSIZE + WALL_THICKNESS * 2); nuclear@1: xform.set_translation(Vector3((HSIZE + WALL_THICKNESS) / 2.0, nuclear@1: WALL_HEIGHT / 2.0 - BOT_THICKNESS, 0)); nuclear@1: tmp.apply_xform(xform); nuclear@1: sides->append(tmp); nuclear@1: tmp.clear(); nuclear@1: nuclear@1: gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS); nuclear@1: xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS, nuclear@1: (VSIZE + WALL_THICKNESS) / 2.0)); nuclear@1: tmp.apply_xform(xform); nuclear@1: sides->append(tmp); nuclear@1: tmp.clear(); nuclear@1: nuclear@1: gen_box(&tmp, HSIZE, WALL_HEIGHT, WALL_THICKNESS); nuclear@1: xform.set_translation(Vector3(0, WALL_HEIGHT / 2.0 - BOT_THICKNESS, nuclear@1: -(VSIZE + WALL_THICKNESS) / 2.0)); nuclear@1: tmp.apply_xform(xform); nuclear@1: sides->append(tmp); nuclear@1: tmp.clear(); nuclear@1: nuclear@1: // generate the hinges nuclear@1: Mesh *hinges = new Mesh; nuclear@1: gen_cylinder(hinges, HINGE_RAD, HINGE_HEIGHT, 10, 1, 1); nuclear@1: xform.set_rotation(Vector3(M_PI / 2.0, 0, 0)); nuclear@1: xform.translate(Vector3(0, VSIZE / 4.0, 0)); nuclear@1: hinges->apply_xform(xform); nuclear@1: nuclear@1: gen_cylinder(&tmp, HINGE_RAD, HINGE_HEIGHT, 10, 1, 1); nuclear@1: xform.set_rotation(Vector3(M_PI / 2.0, 0, 0)); nuclear@1: xform.translate(Vector3(0, -VSIZE / 4.0, 0)); nuclear@1: tmp.apply_xform(xform); nuclear@1: nuclear@1: hinges->append(tmp); nuclear@1: nuclear@1: nuclear@1: board_meshes.clear(); nuclear@1: board_meshes.push_back(bottom); nuclear@1: board_meshes.push_back(sides); nuclear@1: board_meshes.push_back(hinges); nuclear@1: return true; nuclear@0: }