void VectorMutable::commit_sub_vector( RTOpPack::MutableSubVector* sub_vec_inout )
{
  RTOpPack::SparseSubVector spc_sub_vec(
    sub_vec_inout->globalOffset(), sub_vec_inout->subDim()
    ,sub_vec_inout->values(), sub_vec_inout->stride()
    );
  VectorMutable::set_sub_vector( spc_sub_vec );            // Commit the changes!
  RTOpPack::SubVector sub_vec(*sub_vec_inout);
  Vector::free_sub_vector( &sub_vec );                     // Free the memory!
  sub_vec_inout->set_uninitialized();                      // Make null as promised!
}
Example #2
0
double			inter_plan(t_object *obj, t_ray *ray)
{
	t_plan		*plan;
	t_vec		tmp;
	double		d;

	plan = &obj->prim.plan;
	sub_vec(&tmp, &ray->ori, &plan->pos);
	d = -(dot_product(&plan->normal, &tmp)
		/ dot_product(&plan->normal, &ray->dir));
	return (d);
}
Example #3
0
File: triangle.c Project: gabfou/RT
void			check_triangle(t_item *item, t_pd *s, t_inter *inter, t_thr *f)
{
	t_vec		n;
	t_vec		a;
	FLOAT_SIZE	t;

	n = (prod_vector(item->tr->u, item->tr->v));
	a.x = -dot_prod(n, sub_vec(s->pos, item->tr->p1));
	a.y = dot_prod(n, s->dir);
	if (fabs(a.y) > 0 && (t = a.x / a.y) >= 0)
	{
		n = sub_vec(set_dist_pos(t, s->dir, s->pos), item->tr->p1);
		a.x = dot_prod(n, item->tr->u);
		a.y = dot_prod(n, item->tr->v);
		a.z = (a.y * item->tr->uv - item->tr->vv * a.x) / item->tr->d;
		a.y = (item->tr->uv * a.x - item->tr->uu * a.y) / item->tr->d;
		if (a.z < 0.0 || a.z > 1.0 || a.y < 0.0 || (a.y + a.z) > 1.0)
			return ;
		if (check_t(inter, t, s, item) == 1 && f->impactmod)
			inter->norm = item->tr->n;
	}
	return ;
}
Example #4
0
void	shade(t_raytracer *ray, t_vec dir)
{
	if (ray->shade > 0)
	{
		ray->l = sub_vec(ray->tmp->pos, ray->pi);
		ray->l = norm(ray->l);
		if (ray->ret->diffuse > 0)
		{
			ray->dot = DOT(ray->n, ray->l);
			if (ray->dot > 0)
				ray->color = dot_positif(ray);
		}
		specular(ray, dir);
	}
}
Example #5
0
void	set_nray(t_raytracer *ray, t_obj *l, t_vec dir, t_vec o)
{
	ray->shade = 1.0f;
	if (ray->tmp->type == SPHERE)
		tmp_type_sphere(ray, l);
	if (ray->ret->type == SPHERE)
	{
		ray->n = sub_vec(ray->pi, ray->ret->pos);
		ray->n = mul_vec(ray->n, 1.0f / ray->ret->radius);
	}
	else if (ray->ret->type == PLAN)
		ray->n = ray->ret->pos;
	else
		ray->n = set_nvec(ray->ret, dir, o, ray->ret2);
}
Example #6
0
double			inter_cylinder(t_object *obj, t_ray *ray)
{
	t_cylinder	*cyl;
	t_vec		tmp;
	double		d;
	double		a;
	double		b;
	double		c;

	cyl = &obj->prim.cylinder;
	sub_vec(&tmp, &ray->ori, &cyl->pos);
	a = pow(ray->dir.x, 2) + pow(ray->dir.y, 2);
	b = 2 * (ray->dir.x * tmp.x + ray->dir.y * tmp.y);
	c = pow(ray->ori.x, 2) + pow(ray->ori.y, 2) - pow(cyl->radius, 2);
	d = determinant(a, b, c);
	return (d);
}
Example #7
0
void	specular(t_raytracer *ray, t_vec dir)
{
	t_specular spc;

	if (ray->ret->specular > 0)
	{
		spc.r_spect = 2.0f * DOT(ray->l, ray->n);
		spc.r_spec = mul_vec(ray->n, spc.r_spect);
		spc.r_spec = sub_vec(ray->l, spc.r_spec);
		spc.dot_spec = DOT(dir, spc.r_spec);
		if (spc.dot_spec > 0)
		{
			spc.spect_diff = powf(spc.dot_spec, 20)
				* ray->ret->specular * ray->shade;
			spc.ret_spec = mul_vec(ray->tmp->col, spc.spect_diff);
			ray->color = add_vec(ray->color, spc.ret_spec);
		}
	}
}
Example #8
0
t_color			diffuse_plan(t_light *li, t_object *obj, t_vec *vi, double sh)
{
	t_color		col;
	t_vec		u;
	double		dot;
	double		diff;

	col.r = 0;
	col.g = 0;
	col.b = 0;
	sub_vec(&u, &li->pos, vi);
	normalize(&u);
	dot = dot_product(&u, &obj->prim.plan.normal);
	if (dot > 0)
	{
		diff = dot * 0.9 * sh;
		diff_col(&col, &obj->color, &li->color, diff);
	}
	return (col);
}
Example #9
0
double			inter_sphere(t_object *obj, t_ray *ray)
{
	t_sphere	*sphere;
	t_vec		tmp;
	double		d;
	double		a;
	double		b;
	double		c;

	sphere = &obj->prim.sphere;
	a = square_length(&ray->dir);
	sub_vec(&tmp, &ray->ori, &sphere->center);
	b = 2 * dot_product(&ray->dir, &tmp);
	c = square_length(&sphere->center) + square_length(&ray->ori)
		+ -2 * dot_product(&sphere->center, &ray->ori)
		- pow(sphere->radius, 2);
	d = determinant(a, b, c);
	if (d >= 0)
		return (d);
	return (-1);
}
Example #10
0
File: pyl.c Project: gabfou/RT
void		check_cyl(t_item *item, t_pd *s, t_inter *inter, int impactmod)
{
	FLOAT_SIZE	a;
	FLOAT_SIZE	b;
	FLOAT_SIZE	c;
	FLOAT_SIZE	t;
	t_vec		l;

	l = sub_vec(s->pos, item->cyl->pos);
	a = dot_prod(s->dir, s->dir) - (dot_prod(s->dir,
		item->cyl->dir) * dot_prod(s->dir, item->cyl->dir));
	b = 2 * (dot_prod(s->dir, l) - (dot_prod(s->dir,
		item->cyl->dir) * dot_prod(l, item->cyl->dir)));
	c = dot_prod(l, l) - (dot_prod(l, item->cyl->dir)
		* dot_prod(l, item->cyl->dir)) - item->cyl->ray * item->cyl->ray;
	if ((t = (b * b - 4.0 * a * c)) <= 0)
		return ;
	t = ft_minspe(((-b + sqrt(t)) / (2 * a)), ((-b - sqrt(t)) / (2 * a)));
	if (check_t(inter, t, s, item) == 1 && impactmod)
		set_normal_cyl(item->cyl, inter);
	return ;
}
Example #11
0
File: triangle.c Project: gabfou/RT
int				point_triangle(t_vec pos, t_triangle *p)
{
	FLOAT_SIZE	accumilator;
	t_vec		dot;
	t_vec		line1;
	t_vec		line2;

	accumilator = 0;
	line1 = normalizator_ret(sub_vec(p->p1, pos));
	line2 = normalizator_ret(sub_vec(p->p2, pos));
	dot.x = dot_prod(line1, line2);
	line1 = normalizator_ret(sub_vec(p->p2, pos));
	line2 = normalizator_ret(sub_vec(p->p3, pos));
	dot.y = dot_prod(line1, line2);
	line1 = normalizator_ret(sub_vec(p->p3, pos));
	line2 = normalizator_ret(sub_vec(p->p1, pos));
	dot.z = dot_prod(line1, line2);
	accumilator = acos(dot.x) + acos(dot.y) + acos(dot.z);
	if (accumilator < (359.9 * M_PI))
		return (0);
	else
		return (1);
}
Example #12
0
File: pyl.c Project: gabfou/RT
void		set_normal_cyl(t_cyl *cyl, t_inter *inter)
{
	inter->norm = normalizator_ret(sub_vec(vector_proj_vector(
		normalizator_ret(sub_vec(cyl->pos, inter->pos)), cyl->dir),
	normalizator_ret(sub_vec(cyl->pos, inter->pos))));
}
Example #13
0
void myKeyHandler(unsigned char ch, int x, int y)
{
  int i;
  static int subdiv=0;
  struct point_t *slice;
  struct point_t *linecur;
  struct point_t *cur;
  struct point_t *new_points;

  struct slice_t *cur_slice,*cur2_slice;
  struct point_t *cur2;
  struct point_t points[5];
  double a,b,c;

  GLfloat v1[3],v2[3],v3[3];

  double deginc;

  //  struct slice_t *cur_slice;

  switch(ch)
    {
    case 'q':
      endSubdiv(0);
      break;

    case 'z':
      mode=(~mode)&1;
      printf("%s\n",mode?"3D mode":"2D mode");
      switch(mode)
	{
	case 0:
	  resetCamera();
	  break;
	case 1:
	  reset3DCamera();
	  break;
	}
      break;

    case 'k':
      /* test phong stuff */
      cur_slice = slices;
      cur2_slice = slices->n;
      //while(cur_slice!=NULL)
	{
	  cur = cur_slice->line;
	  cur2 = cur2_slice->line;
	  //while(cur->n!=NULL)
	    {
	      /* right vertex */
	      add_vec(&(cur->nx),&(cur->n->nx),&(points[0].nx));
	      normalize(&(points[0].nx));
	      sub_vec(&(cur->n->x),&(cur->x),v1);
	      v1[0] /= 2; v1[1] /= 2; v1[2] /= 2;
	      add_vec(&(cur->x),v1,&(points[0].x));
	      
	      /* top vertex */
	      add_vec(&(cur->nx),&(cur2->nx),&(points[1].nx));
	      normalize(&(points[1].nx));
	      sub_vec(&(cur2->x),&(cur->x),v1);
	      v1[0] /= 2; v1[1] /= 2; v1[2] /= 2;
	      add_vec(&(cur->x),v1,&(points[1].x));
	      
	      /* left vertex */
	      add_vec(&(cur2->nx),&(cur2->n->nx),&(points[2].nx));
	      normalize(&(points[2].nx));
	      sub_vec(&(cur2->n->x),&(cur2->x),v1);
	      v1[0] /= 2; v1[1] /= 2; v1[2] /= 2;
	      add_vec(&(cur2->x),v1,&(points[2].x));
	      
	      /* bottom vertex */
	      add_vec(&(cur2->n->nx),&(cur->n->nx),&(points[3].nx));
	      normalize(&(points[3].nx));
	      sub_vec(&(cur->n->x),&(cur2->n->x),v1);
	      v1[0] /= 2; v1[1] /= 2; v1[2] /= 2;
	      add_vec(&(cur2->n->x),v1,&(points[3].x));
	      
	      /* center vertex */
	      add_vec(&(points[0].nx),&(points[1].nx),v1);
	      add_vec(&(points[2].nx),&(points[3].nx),v2);
	      add_vec(v1,v2,&(points[4].nx));
	      normalize(&(points[4].nx));
	      sub_vec(&(points[3].x),&(cur2->n->x),v1);
	      sub_vec(&(points[2].x),&(cur2->n->x),v2);
	      add_vec(v1,v2,v3);
	      normalize(v3);
	      a=sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
	      b=sqrt(v2[0]*v2[0]+v2[1]*v2[1]+v2[2]*v2[2]);
	      c=sqrt(a*a+b*b);
	      v3[0] *= c; v3[1] *= c; v3[2] *= c;
	      add_vec(&(cur2->n->x),v3,&(points[4].x));

	      printf("v2[0]=%f,v2[1]=%f,v2[2]=%f\nv3[0]=%f,v3[1]=%f,v3[2]=%f\n",v2[0],v2[1],v2[2],v3[0],v3[1],v3[2]);

	      for(i=0; i<5; i++)
		printf("points[%d]->x=%f,points[%d]->y=%f,points[%d]->z=%f\n",
		       i,points[i].x,i,points[i].y,i,points[i].z);
	      printf("cur->x=%f,cur->y=%f,cur->z=%f\ncur->n->x=%f,cur->n->y=%f,cur->n->z=%f\n",
		     cur->x,cur->y,cur->z,cur->n->x,cur->n->y,cur->n->z);
	      printf("cur2->x=%f,cur2->y=%f,cur2->z=%f\ncur2->n->x=%f,cur2->n->y=%f,cur2->n->z=%f\n",
		     cur2->x,cur2->y,cur2->z,cur2->n->x,cur2->n->y,cur2->n->z);

	      cur = cur->n;
	      cur2 = cur2->n;
	    }

	  cur_slice = cur_slice->n;
	  cur2_slice = cur2_slice->n != NULL ? cur2_slice->n : slices; /* circle around */
	}
      break;

    case 'n':
      normals=(~normals)&1;
      printf("Normal mode %s\n",normals?"on":"off");
      break;

    case 'e':
      solid=(~solid)&1;
      printf("%s\n",solid?"Solid mode":"Wireframe mode");
      switch(solid)
	{
	case 0:
	  glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	  break;
	case 1:
	  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
	  break;
	}
      break;

    case 'r':
      faces=(~faces)&1;
      printf("%s\n",faces?"Faces mode":"Control points mode");
      break;

    case 'w': /* calculate initial 3d object */
      if(num<5)
	printf("There must be at least 5 control points.\n");
      else if(!mode)
	{
	  mode=(~mode)&1;
	  printf("%s\n",mode?"3D mode":"2D mode");
	  switch(mode)
	    {
	    case 0:
	      resetCamera();
	      break;
	    case 1:
	      reset3DCamera();
	      break;
	    }
	  freeModel();
	  subdiv_v = 0;
	  subdiv_h = NUMSLICES;

	  /* the radius of the circle for each of the points is x */
	  for(i=0;i<subdiv_h;i++)
	    {
	      ALLOC_POINT(slice);
	      cur=slice;

	      linecur=line;
	      while(linecur!=NULL)
		{
		  cur->z = linecur->x*sin(DEGINC*i);
		  cur->x = linecur->x*cos(DEGINC*i);
		  cur->y = linecur->y;

		  linecur = linecur->n;
		  if(linecur!=NULL)
		    {
		      ALLOC_POINT(cur->n);
		      cur = cur->n;
		    }
		}

	      addSlice(slice);
	    }
	}

      recompute_normals();

      break;
     
    case 's': /* horizontal subdivision */

      if(!mode || slices==NULL) break;

      /* backup the original slice */
      new_points = duplicate_slice(slices->line);
      freeModel();

      subdiv_h<<=1;
      subdiv++;
      printf("Horizontal subdivision level %d\n",subdiv);
     
      deginc = 2*M_PI/subdiv_h;

      for(i=0;i<subdiv_h;i++)
	{
	  ALLOC_POINT(slice);
	  cur=slice;

	  linecur=new_points;
	  while(linecur!=NULL)
	    {
	      cur->z = linecur->x*sin(deginc*i);
	      cur->x = linecur->x*cos(deginc*i);
	      cur->y = linecur->y;

	      linecur = linecur->n;
	      if(linecur!=NULL)
		{
		  ALLOC_POINT(cur->n);
		  cur = cur->n;
		}
	    }

	  addSlice(slice);
	}

      recompute_normals();

      break;

    case 'a': /* vertical subdivision */

      if(!mode || slices==NULL) break;
      cur_slice=slices;
      
      subdiv_v++;
      printf("Vertical subdivision level %d\n",subdiv_v);
            
      linecur = cur_slice->line;
      /* calc the first point */
      cur = new_points = calc_point(linecur,linecur,linecur->n,linecur->n->n);
      
      /* calc middle and last points */
      while(linecur->n->n!=NULL)
	{
	  if(linecur->n->n->n!=NULL) /* middle points */
	    cur->n = calc_point(linecur,linecur->n,linecur->n->n,linecur->n->n->n);
	  else
	    cur->n = calc_point(linecur,linecur->n,linecur->n->n,linecur->n->n);
	  cur = cur->n;
	  linecur = linecur->n;
	}
      
      interleave(cur_slice->line,new_points);
      
      new_points = duplicate_slice(cur_slice->line);
      
      deginc = 2*M_PI/subdiv_h;

      freeModel();

      for(i=0;i<subdiv_h;i++)
	{
	  ALLOC_POINT(slice);
	  cur=slice;

	  linecur=new_points;
	  while(linecur!=NULL)
	    {
	      cur->z = linecur->x*sin(deginc*i);
	      cur->x = linecur->x*cos(deginc*i);
	      cur->y = linecur->y;

	      linecur = linecur->n;
	      if(linecur!=NULL)
		{
		  ALLOC_POINT(cur->n);
		  cur = cur->n;
		}
	    }
	  
	  addSlice(slice);
	}

      recompute_normals();

	break;

    case 'd':
      shading=(~shading)&1;
      printf("%s shading\n",shading?"Phong":"Gouraud");
      break;

    case '<':
      if(mode)
	{
	  glMatrixMode(GL_MODELVIEW);
	  glRotatef(1,0.0,1.0,0.0);
	}
      break;
    case '>':
      if(mode)
	{
	  glMatrixMode(GL_MODELVIEW);
	  glRotatef(-1,0.0,1.0,0.0);
	}
      break;

    default:
      /* Unrecognized keypress */
      return;
    }
  
  glutPostRedisplay();
  
  return;
}