예제 #1
0
  void displayFunc(void)
  {
    /* create random geometry for regression test */
    if (g_regression)
      g_render_scene = createRandomScene(g_device,1,random<int>()%1000,random<int>()%1000);

    /* set accumulation mode */
    int accumulate = g_resetAccumulation ? 0 : g_refine;
    g_resetAccumulation = false;

    /* render image */
    Handle<Device::RTCamera> camera = createCamera(AffineSpace3f(g_camSpace.l,g_camSpace.p));

    /* render into framebuffer */
    double t0 = getSeconds();
    g_device->rtRenderFrame(g_renderer,camera,g_render_scene,g_tonemapper,g_frameBuffer,accumulate);
    g_device->rtSwapBuffers(g_frameBuffer);

    /* draw image in OpenGL */
    void* ptr = g_device->rtMapFrameBuffer(g_frameBuffer);
    glRasterPos2i(-1, 1);
    glPixelZoom(1.0f, -1.0f);
    glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGBA,GL_FLOAT,ptr);
    g_device->rtUnmapFrameBuffer(g_frameBuffer);
    glutSwapBuffers();
    double dt = getSeconds()-t0;

    /* measure rendering time */
    std::ostringstream stream;
    stream.setf(std::ios::fixed, std::ios::floatfield);
    stream.precision(2);
    stream << 1.0f/dt << " fps, ";
    stream.precision(0);
    stream << dt*1000.0f << " ms";
    std::cout << "display " << stream.str() << std::endl;
    glutSetWindowTitle((std::string("Embree: ") + stream.str()).c_str());
  }
예제 #2
0
  void displayFunc(void)
  {
    if (g_pause)
      return;

    if (g_demo) 
    {
      double restart_time = 15.0f;
      double dt = getSeconds()-g_demo_t0;
      if (dt > restart_time) {
        dt -= restart_time;
        g_demo_t0 = getSeconds() - dt;
      }
      float theta = dt * 90.0f / 180.0f * float(pi);
      float phi = 0.0f;
      if (theta >= 2.0f*float(pi)) theta = 2.0f*float(pi);
      
      const Vector3f viewVec = normalize(g_initial_camLookAt - g_initial_camPos);
      const float dist = length(g_initial_camLookAt - g_initial_camPos);
      //const Vector3f dX = normalize(cross(viewVec,g_initial_camUp));
      //const Vector3f dY = normalize(cross(viewVec,dX));
      const Vector3f dY = normalize(g_initial_camUp);
      AffineSpace3f space = g_demo_camSpace;
      //space = AffineSpace3f::rotate(g_initial_camLookAt,dX,phi  ) * space; 
      space = AffineSpace3f::rotate(g_initial_camLookAt,dY,theta) * space; 
      //g_camPos = g_camLookAt-dist*xfmVector(g_camSpace,Vector3f(0,0,1));
      g_camSpace = space;
      
      static int extra_resets = 0;
      if (theta < 2.0f*float(pi)) {
        g_resetAccumulation = true;
        extra_resets = 0;
      } else if (extra_resets < 2) {
        g_resetAccumulation = true;
        extra_resets++;
      }
    }
    
    /* create random geometry for regression test */
    if (g_regression)
      g_render_scene = createRandomScene(g_device,1,random<int>()%100,random<int>()%1000);

    /* set accumulation mode */
    int accumulate = g_resetAccumulation ? 0 : g_refine;
    g_resetAccumulation = false;

    /* render image */
    Handle<Device::RTCamera> camera = createCamera(AffineSpace3f(g_camSpace.l,g_camSpace.p));

    /* render into framebuffer */
    g_device->rtRenderFrame(g_renderer,camera,g_render_scene,g_tonemapper,g_frameBuffer,accumulate);
    g_device->rtSwapBuffers(g_frameBuffer);

    /* draw image in OpenGL */
    void* ptr = g_device->rtMapFrameBuffer(g_frameBuffer);

    glRasterPos2i(-1, 1);
    glPixelZoom(1.0f, -1.0f);

    if (g_format == "RGB_FLOAT32")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGB,GL_FLOAT,ptr);
    else if (g_format == "RGBA8")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGBA,GL_UNSIGNED_BYTE,ptr);
    else if (g_format == "RGB8")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGB,GL_UNSIGNED_BYTE,ptr);
    else 
    throw std::runtime_error("unknown framebuffer format: "+g_format);
                                                    
    glFlush();
    glutSwapBuffers();

    g_device->rtUnmapFrameBuffer(g_frameBuffer);

    /* calculate rendering time */
    double t1 = getSeconds();
    g_dt[frameID % avgFrames] = t1-g_t0; g_t0 = t1;
    frameID++;

    /* print average render time of previous frames */
    size_t num = 0;
    double dt = 0.0f;
    for (size_t i=0; i<avgFrames; i++) {
      if (g_dt[i] != 0.0f) {
        dt += g_dt[i]; num++;
      }
    }
    dt /= num;

    std::ostringstream stream;
    stream.setf(std::ios::fixed, std::ios::floatfield);
    stream.precision(2);
    stream << 1.0f/dt << " fps, ";
    stream.precision(2);
    stream << dt*1000.0f << " ms";
    stream << ", " << g_width << "x" << g_height;
    if (log_display)
      std::cout << "display " << stream.str() << std::endl;
    glutSetWindowTitle((std::string("Embree: ") + stream.str()).c_str());

  }
예제 #3
0
  void displayFunc(void)
  {
    if (g_pause)
      return;
    
    /* create random geometry for regression test */
    if (g_regression)
      g_render_scene = createRandomScene(g_device,1,random<int>()%100,random<int>()%1000);

    /* set accumulation mode */
    int accumulate = g_resetAccumulation ? 0 : g_refine;
    g_resetAccumulation = false;

    /* render image */
    Handle<Device::RTCamera> camera = createCamera(AffineSpace3f(g_camSpace.l,g_camSpace.p));

    /* render into framebuffer */
    g_device->rtRenderFrame(g_renderer,camera,g_render_scene,g_tonemapper,g_frameBuffer,accumulate);
    g_device->rtSwapBuffers(g_frameBuffer);

    /* draw image in OpenGL */
    void* ptr = g_device->rtMapFrameBuffer(g_frameBuffer);

    // extern double upload_time;
    
    // upload_time = getSeconds() - upload_time;
    // std::cout << "upload " << upload_time << std::endl;
    // exit(0);

    glRasterPos2i(-1, 1);
    glPixelZoom(1.0f, -1.0f);

    if (g_format == "RGB_FLOAT32")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGB,GL_FLOAT,ptr);
    else if (g_format == "RGBA8")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGBA,GL_UNSIGNED_BYTE,ptr);
    else if (g_format == "RGB8")
      glDrawPixels((GLsizei)g_width,(GLsizei)g_height,GL_RGB,GL_UNSIGNED_BYTE,ptr);
    else 
    throw std::runtime_error("unknown framebuffer format: "+g_format);
                                                    
    glFlush();
    glutSwapBuffers();

    g_device->rtUnmapFrameBuffer(g_frameBuffer);

    /* calculate rendering time */
    double t1 = getSeconds();
    g_dt[frameID % avgFrames] = t1-g_t0; g_t0 = t1;
    frameID++;

    /* print average render time of previous frames */
    size_t num = 0;
    double dt = 0.0f;
    for (size_t i=0; i<avgFrames; i++) {
      if (g_dt[i] != 0.0f) {
        dt += g_dt[i]; num++;
      }
    }
    dt /= num;

    std::ostringstream stream;
    stream.setf(std::ios::fixed, std::ios::floatfield);
    stream.precision(2);
    stream << 1.0f/dt << " fps, ";
    stream.precision(2);
    stream << dt*1000.0f << " ms";
    stream << ", " << g_width << "x" << g_height;
    if (log_display)
      std::cout << "display " << stream.str() << std::endl;
    glutSetWindowTitle((std::string("Embree: ") + stream.str()).c_str());

  }