From: <ma...@us...> - 2003-07-16 07:20:52
|
Update of /cvsroot/jrman/drafts/src/org/jrman/render In directory sc8-pr-cvs1:/tmp/cvs-serv5923/src/org/jrman/render Modified Files: RendererHidden.java Log Message: Fixed displacement bound bugs. Index: RendererHidden.java =================================================================== RCS file: /cvsroot/jrman/drafts/src/org/jrman/render/RendererHidden.java,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** RendererHidden.java 12 Jul 2003 21:09:42 -0000 1.37 --- RendererHidden.java 16 Jul 2003 07:20:49 -0000 1.38 *************** *** 147,156 **** boolean check) { BoundingVolume bv = primitive.getBoundingVolume(); bv = bv.transform(objectToCamera); ! if (clippingVolume.whereIs(bv) == Plane.Side.OUTSIDE) return true; Plane.Side side = bv.whichSideOf(eyePlane); if (side == Plane.Side.INSIDE) { ! placeInBucket(primitive, bv, objectToCamera, curColumn, curRow, check); return true; } --- 147,160 ---- boolean check) { BoundingVolume bv = primitive.getBoundingVolume(); + float db = primitive.getAttributes().getDisplacementBound(); + BoundingVolume bve; + bve = bv.enlarge(db); + bve = bve.transform(objectToCamera); bv = bv.transform(objectToCamera); ! if (clippingVolume.whereIs(bve) == Plane.Side.OUTSIDE) return true; Plane.Side side = bv.whichSideOf(eyePlane); if (side == Plane.Side.INSIDE) { ! placeInBucket(primitive, bve, bv, objectToCamera, curColumn, curRow, check); return true; } *************** *** 159,162 **** --- 163,167 ---- return false; Primitive[] sub = primitive.split(); + // TODO: don't eliminate too many sbprimitives for (int i = 0; i < sub.length; i++) if (!addPrimitive(sub[i], *************** *** 172,175 **** --- 177,181 ---- private void placeInBucket( Primitive primitive, + BoundingVolume bve, BoundingVolume bv, Transform objectToCamera, *************** *** 177,200 **** int row, boolean check) { ! float dist = bv.getMinZ(); bv = bv.transform(cameraToRaster); primitive.setDistance(bv.getMinZ()); ! Bounds2f bounds; float db = primitive.getAttributes().getDisplacementBound(); if (db != 0f) { ! vtmp.set(db, 0f, 0f); ! objectToCamera.transformVector(vtmp, vtmp); ! float l = vtmp.length(); ! vtmp.set(l, 0f, 0f); ! ptmp1.set(0f, 0f, dist); ! ptmp2.add(ptmp1, vtmp); ! cameraToRaster.transformPoint(ptmp1, ptmp1); ! cameraToRaster.transformPoint(ptmp2, ptmp2); ! vtmp.sub(ptmp1, ptmp2); ! float screenDisplacement = vtmp.length(); ! bounds = bv.toBounds2f(screenDisplacement); ! primitive.setScreenDisplacement(screenDisplacement); ! } else { ! bounds = bv.toBounds2f(); } primitive.setRasterBounds(bounds); --- 183,197 ---- int row, boolean check) { ! bve = bve.transform(cameraToRaster); bv = bv.transform(cameraToRaster); primitive.setDistance(bv.getMinZ()); ! Bounds2f bounds = bve.toBounds2f(); float db = primitive.getAttributes().getDisplacementBound(); if (db != 0f) { ! Bounds2f bnd = bv.toBounds2f(); ! float dw = bounds.getWidth() - bnd.getWidth(); ! float dh = bounds.getHeight() - bnd.getHeight(); ! primitive.setScreenDisplacementWidth(dw); ! primitive.setScreenDisplacementHeight(dh); } primitive.setRasterBounds(bounds); *************** *** 243,253 **** float mpMaxX = mp.getMaxX() - rasterWindowMin.x; float mpMaxY = mp.getMaxY() - rasterWindowMin.y; ! int minColumn = Calc.clamp((int) (mpMinX / bucketWidth), 0, bucketColumns - 1); ! int minRow = Calc.clamp((int) (mpMinY / bucketHeight), 0, bucketRows - 1); ! int maxColumn = Calc.clamp((int) (mpMaxX / bucketWidth), 0, bucketColumns - 1); ! int maxRow = Calc.clamp((int) (mpMaxY / bucketHeight), 0, bucketRows - 1); for (int col = minColumn; col <= maxColumn; col++) for (int row = minRow; row <= maxRow; row++) ! getBucket(col, row).addMicropolygon(mp); } --- 240,251 ---- float mpMaxX = mp.getMaxX() - rasterWindowMin.x; float mpMaxY = mp.getMaxY() - rasterWindowMin.y; ! int minColumn = (int) (mpMinX / bucketWidth); ! int minRow = (int) (mpMinY / bucketHeight); ! int maxColumn = (int) (mpMaxX / bucketWidth); ! int maxRow = (int) (mpMaxY / bucketHeight); for (int col = minColumn; col <= maxColumn; col++) for (int row = minRow; row <= maxRow; row++) ! if (col >= 0 && col < bucketColumns && row >= 0 && row < bucketRows) ! getBucket(col, row).addMicropolygon(mp); } *************** *** 503,509 **** Point3f lowerLeft = new Point3f(min.x, min.y, 1f); Point3f lowerRight = new Point3f(max.x, min.y, 1f); ! clippingVolume.addPlane(Plane.createWithThreePoints(origin, upperLeft, upperRight)); ! clippingVolume.addPlane(Plane.createWithThreePoints(origin, upperRight, lowerRight)); ! clippingVolume.addPlane(Plane.createWithThreePoints(origin, lowerRight, lowerLeft)); clippingVolume.addPlane(Plane.createWithThreePoints(origin, lowerLeft, upperLeft)); } else { --- 501,510 ---- Point3f lowerLeft = new Point3f(min.x, min.y, 1f); Point3f lowerRight = new Point3f(max.x, min.y, 1f); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(origin, upperLeft, upperRight)); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(origin, upperRight, lowerRight)); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(origin, lowerRight, lowerLeft)); clippingVolume.addPlane(Plane.createWithThreePoints(origin, lowerLeft, upperLeft)); } else { *************** *** 516,523 **** Point3f originLowerLeft = new Point3f(min.x, min.y, 0f); Point3f originLowerRight = new Point3f(max.x, min.y, 0f); ! clippingVolume.addPlane(Plane.createWithThreePoints(originUpperLeft, upperLeft, upperRight)); ! clippingVolume.addPlane(Plane.createWithThreePoints(originUpperRight, upperRight, lowerRight)); ! clippingVolume.addPlane(Plane.createWithThreePoints(originLowerRight, lowerRight, lowerLeft)); ! clippingVolume.addPlane(Plane.createWithThreePoints(originLowerLeft, lowerLeft, upperLeft)); } float near = frame.getNearClipping(); --- 517,528 ---- Point3f originLowerLeft = new Point3f(min.x, min.y, 0f); Point3f originLowerRight = new Point3f(max.x, min.y, 0f); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(originUpperLeft, upperLeft, upperRight)); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(originUpperRight, upperRight, lowerRight)); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(originLowerRight, lowerRight, lowerLeft)); ! clippingVolume.addPlane( ! Plane.createWithThreePoints(originLowerLeft, lowerLeft, upperLeft)); } float near = frame.getNearClipping(); |