@Override public BoundingBox getBounds() { // If there are no charges, return an empty box. if (charges.size() <= 0) return new BoundingBox(0, 0, 0, 0, 0, 0); if (cachedBounds == null) { // Start with the box of the first charge. Charge c = charges.get(0); double ext = Math.abs(c.w); double corr = 1.0 + (0.1 / hardness); // see note cachedBounds = new BoundingBox( new Vec3(c.x - ext, c.y - ext, c.z - ext).times(corr), new Vec3(c.x + ext, c.y + ext, c.z + ext).times(corr)); // A note on "corr": // As blobs are blobby, we can't use their weight/radius // directly. This would result in unwanted cut-off's. To // correct this, we extend the bounding box of a charge "a // bit". That "bit" can be smaller if the charge is harder. // Iteratively add the remaining charges. for (int i = 1; i < charges.size(); i++) { c = charges.get(i); ext = Math.abs(c.w); corr = 1.0 + (0.1 / hardness); cachedBounds.extend( new BoundingBox( new Vec3(c.x - ext, c.y - ext, c.z - ext).times(corr), new Vec3(c.x + ext, c.y + ext, c.z + ext).times(corr))); } } return cachedBounds; }
@Override public WireframeMesh getWireframeMesh() { if (cachedWire != null) return cachedWire; // This is a dirty hack. // TODO: Remove it! Vec3 vert[] = new Vec3[0]; int[] from = new int[0]; int[] to = new int[0]; if (charges.size() <= 0) { cachedWire = new NullObject().getWireframeMesh(); return cachedWire; } for (Charge c : charges) { double rad = c.w; Sphere s = new Sphere(rad, rad, rad); WireframeMesh wfm = s.getWireframeMesh(); Vec3[] vert2 = new Vec3[vert.length + wfm.vert.length]; int i; for (i = 0; i < vert.length; i++) vert2[i] = vert[i]; for (Vec3 v : wfm.vert) vert2[i++] = v.plus(new Vec3(c.x, c.y, c.z)); int[] from2 = new int[from.length + wfm.from.length]; for (i = 0; i < from.length; i++) from2[i] = from[i]; for (int foreign = 0; foreign < wfm.from.length; foreign++) from2[i++] = wfm.from[foreign] + vert.length; from = from2; int[] to2 = new int[to.length + wfm.to.length]; for (i = 0; i < to.length; i++) to2[i] = to[i]; for (int foreign = 0; foreign < wfm.to.length; foreign++) to2[i++] = wfm.to[foreign] + vert.length; to = to2; vert = vert2; } return (cachedWire = new WireframeMesh(vert, from, to)); }