X-Git-Url: http://git.mutantstargoat.com?p=demo;a=blobdiff_plain;f=src%2Fmain.cc;h=e5572e25f94cf8342f1fe230e1aafed9d07dff92;hp=4ba8df33b8028ae92266f2065f5c6f71dfd310b4;hb=fd601d4218b63fdf92c5e4dfa32eac8adbda82fa;hpb=df336012c33f2993bdb80177a1f874ef81e7505f diff --git a/src/main.cc b/src/main.cc index 4ba8df3..e5572e2 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -5,6 +7,7 @@ #include +#include "gfxapi.h" #include "global.h" /* TODO: fix those */ @@ -13,14 +16,15 @@ #include "object.h" #include "renderer.h" #include "scene.h" -#include "shader_manager.h" +#include "terrain.h" +#include "texture.h" #include "opengl/opengl.h" #include "vulkan/vk.h" /* static functions */ -static bool init(); +static bool init(Gfx_API api); static void cleanup(); static void display(); @@ -33,7 +37,6 @@ static void clbk_reshape(GLFWwindow *win, int width, int height); /* global variables */ -bool use_vulkan = false; Mat4 mprojection; GLFWwindow *win; @@ -42,32 +45,49 @@ int win_h = 600; float phi = 25; float theta = 0; -float dist = 4; +float dist = 16; ShaderManager *sdr_man; /* variables */ + static float aspect; -static Scene *scene; static OrbitCamera *camera; -static Renderer *rdefault; // default renderer + +static Scene *cow_scene; +static Renderer *cow_rend; + +static Scene *ground_scene; +static Renderer *ground_rend; // default renderer +static Texture *skybox_tex; + +static Renderer *terrain_rend; +static Material terrain_mat; +static Texture *terrain_tex; +static Terrain terrain; + +/* *** */ int main(int argc, char **argv) { + Gfx_API api; + for(int i=0; iset_orbit_params(phi, theta, dist); - scene = new Scene; - if(!scene->load("data/spot/spot.obj")) { - fprintf(stderr, "Failed to load scene.\n"); + // ground_scene = new Scene; + // if(!ground_scene->load("data/ground.obj")) { + // fprintf(stderr, "Failed to load scene: ground.obj.\n"); + // return false; + // } + + // ground_rend = new Renderer; + // ground_rend->camera = camera; + // ground_rend->scene = ground_scene; + + // if(!ground_rend->create()) { + // fprintf(stderr, "Failed to create default renderer.\n"); + // return false; + // } + + // skybox_tex = gfx_create_texture(); + // skybox_tex->load("data/cubemap/cubemap.hdr"); + // ground_rend->set_sky_tex(skybox_tex); + + cow_scene = new Scene; + if(!cow_scene->load("data/spot/spot.obj")) { + fprintf(stderr, "Failed to load scene: spot.obj.\n"); return false; } - rdefault = new Renderer; - rdefault->camera = camera; - rdefault->scene = scene; + cow_rend = new Renderer; + cow_rend->camera = camera; + cow_rend->scene = cow_scene; - if(!rdefault->create()) { - fprintf(stderr, "Failed to create default renderer.\n"); + if(!cow_rend->create()) { + fprintf(stderr, "Failed to create renderer for cows.\n"); return false; } -// TODO delete: debugging - for(size_t i=0; iobjects.size(); ++i) { - printf("object: %d\n", (int)i); - printf("mesh: %s\n", scene->objects[i]->mesh->name.c_str()); - printf("material: %s\n", scene->objects[i]->material->name.c_str()); - printf("transform:\n"); - scene->objects[i]->transform.print(); + terrain_tex = gfx_create_texture(); + if(!terrain_tex->load("data/grass.jpeg")) { + fprintf(stderr, "Failed to load ground texture.\n"); + return false; } + + Image ter_hmap; + if(!ter_hmap.load("data/terhmap.png")) { + fprintf(stderr, "Failed to load terrain heightmap.\n"); + return false; + } + + TerrainParams p; + p.xsz = 50; + p.ysz = 50; + p.max_height = 5; + p.xtiles = 20; + p.ytiles = 20; + p.tile_usub = 10; + p.tile_vsub = 10; + p.num_octaves = 3; + p.noise_freq = 10; + p.coarse_heightmap = &ter_hmap; + + terrain.init(); + terrain.generate(p); + + terrain_mat.diffuse = Vec3(1, 1, 1); + terrain_mat.specular = Vec3(0, 0, 0); + terrain_mat.shininess = 40; + terrain_mat.dtex = terrain_tex; + terrain_mat.name = "tt"; + + terrain.material = terrain_mat; + + terrain_rend = new Renderer; + terrain_rend->camera = camera; + terrain_rend->scene = terrain.get_visible(camera); + if(!terrain_rend->create()) { + fprintf(stderr, "terrain fail\n"); + return false; + } + + +// TODO delete: debugging + // for(size_t i=0; iobjects.size(); ++i) { + // printf("object: %d\n", (int)i); + // printf("mesh: %s\n", ground_scene->objects[i]->mesh->name.c_str()); + // printf("material: %s\n", ground_scene->objects[i]->material->name.c_str()); + // printf("transform:\n"); + // ground_scene->objects[i]->transform.print(); + // } return true; } @@ -138,15 +214,17 @@ static void cleanup() { delete sdr_man; delete camera; - delete scene; - delete rdefault; - if(use_vulkan) { - cleanup_vulkan(); - } - else { - cleanup_opengl(); - } + delete cow_scene; + delete cow_rend; + + // delete ground_scene; + // delete ground_rend; + +//TODO + delete terrain_tex; + delete terrain_rend; + gfx_cleanup(); } static void clbk_key(GLFWwindow *win, int key, int scancode, int action, int mods) @@ -168,17 +246,17 @@ static void clbk_motion(GLFWwindow *win, double x, double y) prev_y = y; if(button[0]) { - theta += dx; - phi += dy; + theta += dx * 0.5; + phi += dy * 0.5; - if(phi < -90) - phi = -90; + if(phi < 0) + phi = 0; if(phi > 90) phi = 90; } if(button[1]) { - dist += dy; + dist += dy * 0.1; if(dist < 0.0) { dist = 0.0; } @@ -193,15 +271,9 @@ static void clbk_mouse(GLFWwindow *win, int bn, int action, int mods) static void clbk_reshape(GLFWwindow *win, int width, int height) { - if(use_vulkan) { - //TODO - return; - } - else { - glViewport(0, 0, width, height); - aspect = (float)width / (float)height; - mprojection = calc_projection_matrix(45, aspect, 0.5, 1000.0); - } + gfx_viewport(0, 0, width, height); + aspect = (float)width / (float)height; + mprojection = calc_projection_matrix(45, aspect, 0.5, 1000.0); win_h = height; win_w = width; @@ -209,6 +281,12 @@ static void clbk_reshape(GLFWwindow *win, int width, int height) static void display() { - camera->set_orbit_params(phi, theta, dist); - rdefault->draw(); + camera->set_orbit_params(theta, phi, dist); + + // gfx_clear(0.76, 0.3, 0.43); + gfx_clear(0.1, 0.1, 0.1); + + terrain_rend->draw(); +// ground_rend->draw(); + cow_rend->draw(); } \ No newline at end of file