Esempio n. 1
0
int main(int argc, char** argv) {

  unsigned width = 800;
  unsigned height = 600;

  // initialize guacamole
  int argc_d = 0;
  char** argv_d = {};
  gua::init(argc_d, argv_d);

  //gua::ShadingModelDatabase::load_shading_models_from("data/materials/");
  //gua::MaterialDatabase::load_materials_from("data/materials/");
  //gua::TextureDatabase::instance()->load("data/textures/0001MM_diff.jpg");

  // setup scene
  gua::SceneGraph graph("main_scenegraph");

  gua::TriMeshLoader trimeshloader;
  gua::NURBSLoader nurbsloader;
  // gua::Video3DLoader videoloader;

  // auto video_geode(videoloader.create_geometry_from_file("video_geode", argv[1]));
  auto teapot_geode(trimeshloader.create_geometry_from_file("teapot_geode", "data/objects/teapot.obj", "data/materials/Red.gmd", gua::TriMeshLoader::DEFAULTS));
  auto plate_geode(trimeshloader.create_geometry_from_file("plate_geode", "data/objects/plate.obj", "data/materials/White.gmd", gua::TriMeshLoader::DEFAULTS));
  auto nurbs_geode(nurbsloader.create_geometry_from_file("nurbs_geode", "data/objects/teapot.igs", "data/materials/Orange.gmd", gua::NURBSLoader::DEFAULTS));

  auto video = graph.add_node<gua::node::TransformNode>("/", "video");
  auto teapot = graph.add_node<gua::node::TransformNode>("/", "teapot");
  auto nurbs = graph.add_node<gua::node::TransformNode>("/", "nurbs");
  auto plate = graph.add_node<gua::node::TransformNode>("/", "plate");

  // graph.add_node("/video", video_geode);
  graph.add_node("/teapot", teapot_geode);
  graph.add_node("/nurbs", nurbs_geode);
  graph.add_node("/plate", plate_geode);


  const float aspect = width * 1.0f/height;
  auto screen = graph.add_node<gua::node::ScreenNode>("/", "screen");
  //screen->data.set_size(gua::math::vec2(aspect*0.05, 0.05));
  screen->data.set_size(gua::math::vec2(aspect*2.0, 2.0));
  screen->translate(0, 0, 6.f);

  auto screen2 = graph.add_node<gua::node::ScreenNode>("/", "screen2");
  //screen2->data.set_size(gua::math::vec2(aspect*0.05, 0.05));
  screen2->data.set_size(gua::math::vec2(aspect*2.0, 2.0));
  screen2->translate(0, 0, 6.f);

  auto eye = graph.add_node<gua::node::TransformNode>("/screen", "eye");
  //eye->translate(0.0, 0.0, 0.025);
  eye->translate(0.0, 0.0, 1.0);

  auto eye2 = graph.add_node<gua::node::TransformNode>("/screen2", "eye2");
  //eye2->translate(0.0, 0.0, 0.025);
  eye2->translate(0.0, 0.0, 1.0);

  auto eye3 = graph.add_node<gua::node::TransformNode>("/", "eye3");
  eye3->translate(-0.05, 0, 7.5);

  auto eye4 = graph.add_node<gua::node::TransformNode>("/", "eye4");
  eye4->translate(0.05, 0, 7.5);

  auto eye5 = graph.add_node<gua::node::TransformNode>("/", "eye5");
  eye5->translate(-0.05, 0, 6.5);

  auto eye6 = graph.add_node<gua::node::TransformNode>("/", "eye6");
  eye6->translate(0.05, 0, 6.5);

  auto eye7 = graph.add_node<gua::node::TransformNode>("/", "eye7");
  eye7->translate(-0.05, 0, 8.5);

  auto eye8 = graph.add_node<gua::node::TransformNode>("/", "eye8");
  eye8->translate(0.05, 0, 8.5);

#if 0

  auto sunlight = graph.add_node<gua::node::SunLightNode>("/", "sunlight");
  sunlight->data.set_shadow_map_size(1024);
  sunlight->data.set_shadow_offset(0.005f);
  sunlight->data.set_enable_shadows(true);
  sunlight->rotate(-90, 1, 0, 0);
  sunlight->translate(0, 0, -5);
#endif

#if 1
  auto spotlight = graph.add_node<gua::node::SpotLightNode>("/", "spotlight");
  spotlight->scale(30.0f);
  spotlight->rotate(-90, 1, 0, 0);
  spotlight->translate(1.0, 18.0, 1.0);

  spotlight->data.set_shadow_map_size(1024);
  spotlight->data.set_falloff(0.1f);
  spotlight->data.set_shadow_offset(0.005f);
  spotlight->data.set_color({ 1.0f, 1.0f, 1.0f });
  //spotlight->data.set_enable_shadows(true);
  spotlight->data.set_enable_shadows(true);
  spotlight->data.set_enable_specular_shading(true);
  spotlight->data.set_enable_diffuse_shading(true);
#endif

  auto pipe  = new gua::Pipeline();
  auto pipe2 = new gua::Pipeline();
  auto pipe3 = new gua::Pipeline();
  auto pipe4 = new gua::Pipeline();


  pipe->config.set_camera(gua::Camera("/screen/eye", "/screen2/eye2",
    "/screen", "/screen2",
    "main_scenegraph"));
  pipe2->config.set_camera(gua::Camera("/eye3", "/eye4",
    "/screen", "/screen",
    "main_scenegraph"));
  pipe3->config.set_camera(gua::Camera("/eye5", "/eye6",
    "/screen", "/screen",
    "main_scenegraph"));
  pipe4->config.set_camera(gua::Camera("/eye7", "/eye8",
    "/screen", "/screen",
    "main_scenegraph"));



  set_pipe_defaults(pipe , width, height);
  set_pipe_defaults(pipe2, width, height);
  set_pipe_defaults(pipe3, width, height);
  set_pipe_defaults(pipe4, width, height);

  auto window (new gua::Window);
  auto window2(new gua::Window);
  auto window3(new gua::Window);
  auto window4(new gua::Window);

#if WIN32
  window->config.set_display_name("\\\\.\\DISPLAY1");
  window2->config.set_display_name("\\\\.\\DISPLAY1");
  window3->config.set_display_name("\\\\.\\DISPLAY1");
  window4->config.set_display_name("\\\\.\\DISPLAY1");
#else
  window->config.set_display_name(":0.0");
  window2->config.set_display_name(":0.0");
  window3->config.set_display_name(":0.0");
  window4->config.set_display_name(":0.0");
#endif


  set_window_default(window, width, height);
  set_window_default(window2, width, height);
  set_window_default(window3, width, height);
  set_window_default(window4, width, height);

#if 0
  //pipe->config.set_enable_stereo(true);
  pipe->config.set_enable_ssao(true);
  pipe->config.set_ssao_intensity(2.f);
  window->config.set_stereo_mode(gua::StereoMode::SIDE_BY_SIDE);
  window->config.set_size(gua::math::vec2ui(2 * width, height));
  window->config.set_left_position(gua::math::vec2ui(0, 0));
  window->config.set_right_position(gua::math::vec2ui(width, 0));
#endif


  pipe->set_window(window);
  pipe2->set_window(window2);
  pipe3->set_window(window3);
  pipe4->set_window(window4);

#if 1
  gua::Renderer renderer({ pipe,
           pipe2,
           pipe3,
           pipe4
                         });
#else
  gua::Renderer renderer({ pipe });
#endif

  // transform teapot
  auto bbox = teapot_geode->get_bounding_box();
  teapot->translate(-bbox.center());
  teapot->scale(5.0f / std::sqrt(bbox.size(0)*bbox.size(0) +
    bbox.size(1)*bbox.size(1) +
    bbox.size(2)*bbox.size(2)));
  teapot->translate(gua::math::vec3{ -2.0f, -1.5f, -4.0f });

  // tranform nurbs
  bbox = nurbs_geode->get_bounding_box();
  nurbs->translate(-bbox.center());
  nurbs->scale(5.0f / std::sqrt(bbox.size(0)*bbox.size(0) +
    bbox.size(1)*bbox.size(1) +
    bbox.size(2)*bbox.size(2)));
  nurbs->rotate(-90, 1, 0, 0);
  nurbs->translate(gua::math::vec3{ 3.0f, -1.5f, -4.0f });

  // transform plate
  plate->scale(0.07);
  plate->translate(0.0f, -4.0f, -4.0f);

  float time_value = 0;

  //nurbs_geode->translate(0.0f, 0.0f, 0.0f);

  // application loop
  while (true) {
    std::this_thread::sleep_for(std::chrono::milliseconds(10));

   scm::math::mat4f ident;
   scm::math::set_identity(ident);
   video->set_transform(ident);

   video->scale(2.0f + std::sin(time_value));
   //video->rotate(10.0f*time_value, 0, 1, 0);
   //video->translate(0, -2.0, -2.0);

   time_value += 0.01f;

   //video_geode->rotate(0.1, 0, 1, 0);

   teapot_geode->rotate(0.3, 0, 1, 0);

   nurbs_geode->rotate(0.3, 0, 0, 1);

   plate->translate(-plate->get_bounding_box().center());
   plate->rotate(0.04f, 0, 1, 0);
   plate->translate(plate->get_bounding_box().center());

    renderer.queue_draw({ &graph });
  }

  return 0;
}
Esempio n. 2
0
int main(int argc, char** argv) {

  //auto resolution = gua::math::vec2ui(800, 600);
  auto resolution = gua::math::vec2ui(3840, 2160);

  // initialize guacamole
  int argc_d = 0;
  char** argv_d = {};
  gua::init(argc_d, argv_d);

  // setup scene
  gua::SceneGraph graph("main_scenegraph");

  auto desc(std::make_shared<gua::MaterialShaderDescription>());
  desc->load_from_file("data/materials/SimpleMaterial.gmd");

  auto shader(std::make_shared<gua::MaterialShader>("simple_mat", desc));
  gua::MaterialShaderDatabase::instance()->add(shader);

  auto mat(shader->make_new_material());

  gua::TriMeshLoader trimeshloader;

  auto teapot_geode(
      trimeshloader.create_geometry_from_file("teapot_geode",
                                              "data/objects/teapot.obj",
                                              mat,
                                              gua::TriMeshLoader::DEFAULTS));
  auto plate_geode(
      trimeshloader.create_geometry_from_file("plate_geode",
                                              "data/objects/plate.obj",
                                              mat,
                                              gua::TriMeshLoader::DEFAULTS));

  auto head = graph.add_node<gua::node::TransformNode>("/", "head");
  head->translate(0.0, 0.0, 8.0);

  auto teapot = graph.add_node<gua::node::TransformNode>("/", "teapot");
  teapot->scale(2.0f);
  auto plate = graph.add_node<gua::node::TransformNode>("/", "plate");

  graph.add_node("/teapot", teapot_geode);
  graph.add_node("/plate", plate_geode);

  const float aspect = resolution.x * 1.0f / resolution.y;

  auto pipe = std::make_shared<gua::PipelineDescription>();

  pipe->add_pass(std::make_shared<gua::TriMeshPassDescription>());
  pipe->add_pass(std::make_shared<gua::TexturedQuadPassDescription>());
  //pipe->add_pass(std::make_shared<gua::BBoxPassDescription>());
  pipe->add_pass(std::make_shared<gua::LightVisibilityPassDescription>());
  pipe->add_pass(std::make_shared<gua::ResolvePassDescription>());
  //pipe->add_pass(std::make_shared<gua::SSAAPassDescription>());
  //pipe->add_pass(std::make_shared<gua::DebugViewPassDescription>());

  auto camera_tl =
      graph.add_node<gua::node::CameraNode>("/head", "camera_tl");
  camera_tl->config.set_output_window_name("window_tl");
  camera_tl->config.set_screen_path("/head/camera_tl/screen_tl");
  camera_tl->config.set_scene_graph_name("main_scenegraph");
  camera_tl->config.set_resolution(resolution);
  camera_tl->config.set_view_id(1);
  camera_tl->set_pipeline_description(pipe);

  auto screen_tl = graph.add_node<gua::node::ScreenNode>("/head/camera_tl", "screen_tl");
  screen_tl->data.set_size(gua::math::vec2(1.6, 0.9));
  screen_tl->translate(-0.8, 0.45, -2.5);

  auto camera_tr =
      graph.add_node<gua::node::CameraNode>("/head", "camera_tr");
  camera_tr->config.set_output_window_name("window_tr");
  camera_tr->config.set_screen_path("/head/camera_tr/screen_tr");
  camera_tr->config.set_scene_graph_name("main_scenegraph");
  camera_tr->config.set_resolution(resolution);
  camera_tr->config.set_view_id(2);
  camera_tr->set_pipeline_description(pipe);

  auto screen_tr = graph.add_node<gua::node::ScreenNode>("/head/camera_tr", "screen_tr");
  screen_tr->data.set_size(gua::math::vec2(1.6, 0.9));
  screen_tr->translate( 0.8f, 0.45, -2.5f);

  auto camera_bl =
      graph.add_node<gua::node::CameraNode>("/head", "camera_bl");
  camera_bl->config.set_output_window_name("window_bl");
  camera_bl->config.set_screen_path("/head/camera_bl/screen_bl");
  camera_bl->config.set_scene_graph_name("main_scenegraph");
  camera_bl->config.set_resolution(resolution);
  //camera_bl->config.set_view_id(2);
  camera_bl->set_pipeline_description(pipe);

  auto screen_bl = graph.add_node<gua::node::ScreenNode>("/head/camera_bl", "screen_bl");
  screen_bl->data.set_size(gua::math::vec2(1.6, 0.9));
  screen_bl->translate(-0.8, -0.45, -2.5f);

  auto camera_br =
      graph.add_node<gua::node::CameraNode>("/head", "camera_br");
  camera_br->config.set_output_window_name("window_br");
  camera_br->config.set_screen_path("/head/camera_br/screen_br");
  camera_br->config.set_scene_graph_name("main_scenegraph");
  camera_br->config.set_resolution(resolution);
  camera_br->set_pipeline_description(pipe);

  auto screen_br = graph.add_node<gua::node::ScreenNode>("/head/camera_br", "screen_br");
  screen_br->data.set_size(gua::math::vec2(1.6, 0.9));
  screen_br->translate( 0.8, -0.45, -2.5f);

  auto pointlight = graph.add_node<gua::node::LightNode>("/", "pointlight");
  pointlight->data.set_type(gua::node::LightNode::Type::POINT);
  pointlight->scale(30.0f);
  pointlight->rotate(-90, 1, 0, 0);
  pointlight->translate(1.0, 18.0, 1.0);

  pointlight->data.set_falloff(0.1f);
  pointlight->data.set_color({
    1.0f, 1.0f, 1.0f
  });
  pointlight->data.set_enable_specular_shading(true);
  pointlight->data.set_enable_diffuse_shading(true);

  auto add_window =
      [](std::string const & window_name,
         std::string const & display,
         std::shared_ptr<gua::node::CameraNode> const & cam_node) {
    auto window = std::make_shared<gua::Window>();
    window->config.set_display_name(display);
    window->join_swap_group(1);
    window->bind_swap_barrier(1);
    gua::WindowDatabase::instance()->add(window_name, window);
    set_window_default(window, cam_node->config.get_resolution());
    cam_node->config.set_output_window_name(window_name);
  };

  add_window("window_tl", ":0.0", camera_tl);

  gua::Renderer renderer;

  // application loop
  gua::events::MainLoop loop;

  gua::events::Ticker ticker(loop, 1.0 / 500.0);

  //gua::Timer frame_timer;
  //frame_timer.start();

  float time_value = 0;

  // application loop
  std::size_t cnt = 0;
  //while (true) {
    //std::this_thread::sleep_for(std::chrono::milliseconds(10));
  ticker.on_tick.connect([&]() {

    teapot_geode->rotate(0.3, 0, 1, 0);

    ++cnt;

    if (cnt == 10) {
      //add_window("window_tr", ":0.0", camera_tr);
      add_window("window_tr", ":0.1", camera_tr);
    }
    if (cnt == 20) {
      //add_window("window_bl", ":0.0", camera_bl);
      add_window("window_bl", ":0.2", camera_bl);
    }
    if (cnt == 30) {
      //add_window("window_br", ":0.0", camera_br);
      add_window("window_br", ":0.3", camera_br);
    }

    // GLFW only allows event processing from main thread
    if (gua::WindowDatabase::instance()->lookup("window_tl")) {
      gua::WindowDatabase::instance()->lookup("window_tl")->process_events();
    }

    if (gua::WindowDatabase::instance()->lookup("window_tr")) {
      gua::WindowDatabase::instance()->lookup("window_tr")->process_events();
    }

    if (gua::WindowDatabase::instance()->lookup("window_bl")) {
      gua::WindowDatabase::instance()->lookup("window_bl")->process_events();
    }

    if (gua::WindowDatabase::instance()->lookup("window_br")) {
      gua::WindowDatabase::instance()->lookup("window_br")->process_events();
    }

    plate->translate(-plate->get_bounding_box().center());
    plate->rotate(0.04f, 0, 1, 0);
    plate->translate(plate->get_bounding_box().center());

    renderer.queue_draw({
      &graph
    });
  });
  //}
  loop.start();
  renderer.stop();

  return 0;
}