nuclear@14: #include nuclear@14: #include "opengl.h" nuclear@14: #include "scenery.h" nuclear@14: #include "game.h" nuclear@14: #include "mesh.h" nuclear@14: #include "meshgen.h" nuclear@14: #include "object.h" nuclear@14: #include "revol.h" nuclear@14: #include "image.h" nuclear@14: nuclear@14: static bool gen_textures(); nuclear@14: nuclear@14: static std::vector obj; nuclear@14: static Image img_marble; nuclear@14: nuclear@14: static const vec2_t table_cp[] = { nuclear@14: {0, 0}, nuclear@14: {3, 0}, // mid 0 nuclear@14: {5.8, 0}, nuclear@14: {5.99, 0}, // mid 1 nuclear@14: {6, -0.15}, nuclear@14: {6.15, -0.15}, // mid 2 nuclear@14: {6.2, -0.4} nuclear@14: }; nuclear@14: static const BezCurve table_curve = { nuclear@14: sizeof table_cp / sizeof *table_cp, nuclear@14: (vec2_t*)table_cp, nuclear@14: 1.0 / 6.2 nuclear@14: }; nuclear@14: nuclear@14: nuclear@14: nuclear@14: bool init_scenery() nuclear@14: { nuclear@14: if(!gen_textures()) { nuclear@14: return false; nuclear@14: } nuclear@14: nuclear@14: Matrix4x4 xform; nuclear@14: nuclear@14: Mesh *table = new Mesh; nuclear@14: gen_revol(table, 48, 12, bezier_revol, bezier_revol_normal, (void*)&table_curve); nuclear@14: table->texcoord_gen_plane(Vector3(0, 1, 0), Vector3(1, 0, 0)); nuclear@14: xform.set_scaling(Vector3(0.5, 0.5, 0.5)); nuclear@14: xform.translate(Vector3(1, 1, 0)); nuclear@14: table->texcoord_apply_xform(xform); nuclear@14: nuclear@14: static const float table_scale = 1.8; nuclear@14: xform.set_scaling(Vector3(table_scale, table_scale, table_scale)); nuclear@14: table->apply_xform(xform); nuclear@14: nuclear@14: Object *otable = new Object; nuclear@14: otable->set_mesh(table); nuclear@14: otable->mtl.diffuse = Vector3(0.6, 0.6, 0.6); nuclear@14: otable->mtl.specular = Vector3(0.8, 0.8, 0.8); nuclear@14: otable->xform().set_translation(Vector3(0, -0.025, 0)); nuclear@14: otable->set_texture(img_marble.texture()); nuclear@14: obj.push_back(otable); nuclear@14: nuclear@14: nuclear@14: // meshgen stats nuclear@14: printf("Generated scenery:\n %u meshes\n", (unsigned int)obj.size()); nuclear@14: unsigned int polycount = 0; nuclear@14: for(size_t i=0; iget_mesh(); nuclear@14: polycount += m->get_poly_count(); nuclear@14: } nuclear@14: printf(" %u polygons\n", polycount); nuclear@14: nuclear@14: return true; nuclear@14: } nuclear@14: nuclear@14: void destroy_scenery() nuclear@14: { nuclear@14: for(size_t i=0; idraw_wire(); nuclear@14: obj[i]->draw_normals(0.075); nuclear@14: } else { nuclear@14: obj[i]->draw(); nuclear@14: } nuclear@14: } nuclear@14: } nuclear@14: nuclear@14: static float marble(float x, float y) nuclear@14: { nuclear@14: float theta = x * M_PI * 2.0 * cos(y * 1.5); nuclear@14: theta += turbulence2(x * 10.0, y * 10.0, 4) * 2; nuclear@14: float val = 0.5 + sin(theta * 5.0) + sin(theta * 8.0) / 2.0 + sin(theta * 19.0) / 4.0; nuclear@14: return val * 0.5 + 0.5; nuclear@14: } nuclear@14: nuclear@14: static bool gen_textures() nuclear@14: { nuclear@14: static const Vector3 marble_col1 = Vector3(0.78, 0.85, 0.85); nuclear@14: static const Vector3 marble_col2 = Vector3(0.56, 0.68, 0.7); nuclear@14: nuclear@14: img_marble.create(512, 512); nuclear@14: unsigned char *pptr = img_marble.pixels; nuclear@14: for(int i=0; i 255 ? 255 : (r < 0 ? 0 : r); nuclear@14: pptr[1] = g > 255 ? 255 : (g < 0 ? 0 : g); nuclear@14: pptr[2] = b > 255 ? 255 : (b < 0 ? 0 : b); nuclear@14: pptr += 3; nuclear@14: } nuclear@14: } nuclear@14: img_marble.texture(); nuclear@14: nuclear@14: return true; nuclear@14: }