Exemple #1
0
distance map(const vec3& p)
{
	float f = length(p) - 2.0f;
	float d = max(f, length(vec2(p.x, p.y)) - 0.5f);
	d = min(d, max(f, length(vec2(p.z, p.y)) - 0.5f));
	d = min(d, max(f, length(vec2(p.z, p.x)) - 0.5f));
	d = min(max(-f - 0.5f, d), max(-d, f + 1.0f));

	distance shape {
		d,
		0
	};

	d = d_outline_diamond(shape.field - 0.25, p, vec3(1, 0, 0), 0.05);
	d = min(d, d_outline_diamond(shape.field - 0.25, p, vec3(0, 1, 0), 0.05));
	d = min(d, d_outline_diamond(shape.field - 0.25, p, vec3(0, 0, 1), 0.05));

	distance outline {
		d,
		1
	};

	d = d_plane(p + vec3(0, 3, 0), vec3(0, 1, 0));

	distance floor {
		d,
		2
	};

	return o_union(floor, o_union(shape, outline));
}
Exemple #2
0
bool kgmCollision::ob_collision(obox3& s_box, kgmList<triangle3>& d_poly, mtx4& d_tran)
{
  vec3               s_points[8];
  kgmPlane3d<float>  s_planes[3];

  s_box.points(s_points);

  s_planes[0] = kgmPlane3d<float>(s_points[0], s_points[2], s_points[1]);
  s_planes[1] = kgmPlane3d<float>(s_points[0], s_points[4], s_points[3]);
  s_planes[2] = kgmPlane3d<float>(s_points[0], s_points[1], s_points[5]);

  float dims[3] = {s_box.dimension.z, s_box.dimension.x, s_box.dimension.y};

  int  sides = 0;
  bool cross = false;

  for(kgmList<triangle3>::iterator i = d_poly.begin(); i != d_poly.end(); ++i)
  {
    triangle3 poly = (*i);
    vec3     points[3];

    for(int j = 0; j < 3; j++)
    {
      points[j] = d_tran * poly.pt[j];
    }

    plane3 d_plane(points[0], points[1], points[2]);

    sides = 0;

    for(int j = 0; j < 8; j++)
    {
      float dist = d_plane.distance(s_points[j]);

      if(dist < 0)
        sides--;
      else
        sides++;
    }

    if(abs(sides) == 8)
    {
      continue;
    }
    else
    {
      cross = false;

      for(int j = 0; j < 3; j++)
      {
        sides = 0;
        cross = false;

        for(int k = 0; k < 3; k++)
        {
          float dist = s_planes[j].distance(s_points[j]);

          if(dist < 0 && dist > (dims[j]))
            cross = true;

          if(dist < 0)
            sides--;
          else
            sides++;
        }
      }

      if(cross || (abs(sides) != 8))
      {
        return true;
      }
    }
  }

  return false;
}