示例#1
0
void
view_render (View *view)
{
  RenderState *rstate = render_state_new ();
  gint i;

  gl_drawing_area_make_current (view->context);
  glClearColor (0.0, 0.0, 0.0, 0.0);
  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  camera_load (view->camera);
  for (i = 0; i < view->nlights; i++)
    light_set (view->lights[i]);
  scene_render (view->scene, rstate);

  gl_drawing_area_swap_buffers (view->context);
  g_object_unref (rstate);
}
示例#2
0
SceneObject*
view_pick (View *view, guint pos[2])
{
  RenderState *rstate = render_state_new ();
  GLuint viewport[4];
  gint width, height;

  gdk_window_get_size (GTK_WIDGET(view->context)->window, &width, &height);
  gl_drawing_area_make_current (view->context);

  rstate->picking = TRUE;

  glGetIntegerv (GL_VIEWPORT, viewport);
  glMatrixMode (GL_PROJECTION);
  glPushMatrix ();
  glLoadIdentity ();
  gluPickMatrix ((double)pos[0], (double) (viewport[3] - pos[1]), 1.0, 1.0, viewport);
  gluPerspective (45.0, (float)width / (float)height, 0.1, 2500.0);

  glMatrixMode (GL_MODELVIEW);
  camera_load (view->camera);
  return scene_pick (view->scene, rstate, pos);
}
示例#3
0
//render area with external threading
void lime_render_area(Rect *area, Filter *f, int thread_id)
{
  int j;
  Render_Node *waiter;
  Render_Node *job;
  Dim *ch_dim;
  
  if (!f)
    return;
  
  lime_lock();
  
  lime_config_test(f);
  
  lime_filter_config_ref(f);
  
  ch_dim = meta_child_data_by_type(ea_data(f->node->con_ch_in, 0), MT_IMGSIZE);
  
  assert(area->corner.x < DIV_SHIFT_ROUND_UP(ch_dim->width, area->corner.scale));
  assert(area->corner.y < DIV_SHIFT_ROUND_UP(ch_dim->height, area->corner.scale));
  
  Render_State *state = render_state_new(area, f);
  
  while ((job = render_state_getjob(state))) {
    assert(job->need == 0);
    
    if (job->mode == MODE_CLOBBER || job->mode == MODE_INPUT) {
      assert(job->tile->refs > 0);
      filter_render_tile(job, thread_id);
    }
    //MODE_ITER
    else if (job->mode == MODE_ITER) {
      if (job->f->mode_iter->finish)
	job->f->mode_iter->finish(job->f);
    }
    else
      abort();

    if (job->tile && job->tile->want)
      while(ea_count(job->tile->want)) {
	waiter = ea_pop(job->tile->want);
        if (waiter->mode != MODE_ITER) {
          for(j=0;j<ea_count(waiter->f_source);j++)
            if (filter_hash_value_get(ea_data(waiter->f_source, j)) == job->tile->filterhash)
              //FIXME channel selection, use paired channels not blindly the same number!
              clobbertile_add(ea_data(waiter->inputs, j), ea_data(job->tile->channels, j));
        }
	waiter->need--;
	if (!waiter->need) {
	  ea_push(waiter->state->ready, waiter);
	  waiter->state->pending--;
	}
	//FIXME add proper interface!
	else if (!strcmp(waiter->f->fc->shortname, "savejpeg") || !strcmp(waiter->f->fc->shortname, "savetiff"))
          cache_stats_print();
      }
    
    if (job->tile)
      job->tile->refs--;

    render_node_del(job);
  }
  
  render_state_del(state);
  
  lime_filter_config_unref(f);
  lime_unlock();
}