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)); }
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; }