@Override
    public boolean shadow_hit(Ray ray, FloatRef tmin) {
        if (bounds != null && !bounds.hit(ray))
            return false;

        float tMin = Float.MAX_VALUE;
        boolean hit = false;

        for (GeometricObject obj : objects) {
            FloatRef fr = new FloatRef();
            if (obj.shadow_hit(ray, fr) && fr.value < tMin) {
                hit = true;
                tMin = fr.value;
            }
        }

        if (hit) {
            tmin.value = tMin;
        }
        return hit;
    }