public void modify(ShadingState state) { Point3 p = state.transformWorldToObject(state.getPoint()); p.x *= size; p.y *= size; p.z *= size; Vector3 normal = state.transformNormalWorldToObject(state.getNormal()); double f0 = f(p.x, p.y, p.z); double fx = f(p.x + .0001, p.y, p.z); double fy = f(p.x, p.y + .0001, p.z); double fz = f(p.x, p.y, p.z + .0001); normal.x -= scale * (float)((fx - f0) / .0001); normal.y -= scale * (float)((fy - f0) / .0001); normal.z -= scale * (float)((fz - f0) / .0001); normal.normalize(); state.getNormal().set(state.transformNormalObjectToWorld(normal)); state.getNormal().normalize(); state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal())); }