X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Frenderer%2Fraster%2Fshapes%2Fcomposite%2Fbase%2FAbstractCompositeShape.java;h=52acbc2919df878cee23402fd8db006810ba8673;hb=9f20345e99404017a98d3ae95b7588cabb31a9bf;hp=184d57a7e77a68649e2a7c1d78758db93b8ed577;hpb=8aa50f568d2edcfe974ceed4192158951e7f3215;p=sixth-3d.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/base/AbstractCompositeShape.java b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/base/AbstractCompositeShape.java index 184d57a..52acbc2 100644 --- a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/base/AbstractCompositeShape.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/base/AbstractCompositeShape.java @@ -1,5 +1,5 @@ /* - * Sixth 3D engine. Author: Svjatoslav Agejenko. + * Sixth 3D engine. Author: Svjatoslav Agejenko. * This project is released under Creative Commons Zero (CC0) license. */ package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.base; @@ -9,7 +9,7 @@ import eu.svjatoslav.sixth.e3d.gui.RenderingContext; import eu.svjatoslav.sixth.e3d.gui.UserRelativityTracker; import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController; import eu.svjatoslav.sixth.e3d.math.Transform; -import eu.svjatoslav.sixth.e3d.math.TransformsPipeline; +import eu.svjatoslav.sixth.e3d.math.TransformsStack; import eu.svjatoslav.sixth.e3d.renderer.raster.Color; import eu.svjatoslav.sixth.e3d.renderer.raster.RenderAggregator; import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.AbstractShape; @@ -22,11 +22,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -/** - * In order to get perspective correct textures, large textured polygons are - * sliced into smaller ones. - */ - public class AbstractCompositeShape extends AbstractShape { private final List originalSubShapes = new ArrayList<>(); private final UserRelativityTracker relativityTracker; @@ -64,7 +59,7 @@ public class AbstractCompositeShape extends AbstractShape { * This method should be overridden by anyone wanting to customize shape * before it is rendered. */ - public void beforeTransformHook(final TransformsPipeline transformPipe, + public void beforeTransformHook(final TransformsStack transformPipe, final RenderingContext context) { } @@ -87,19 +82,19 @@ public class AbstractCompositeShape extends AbstractShape { }); } - private boolean isReslicingNeeded(double sliceFactor1, double sliceFactor2) { + private boolean isReslicingNeeded(double proposedNewSliceFactor, double currentSliceFactor) { if (slicingOutdated) return true; - if (sliceFactor1 > sliceFactor2) { - final double tmp = sliceFactor1; - sliceFactor1 = sliceFactor2; - sliceFactor2 = tmp; + // reslice if there is significant difference between proposed and current slice factor + if (proposedNewSliceFactor > currentSliceFactor) { + final double tmp = proposedNewSliceFactor; + proposedNewSliceFactor = currentSliceFactor; + currentSliceFactor = tmp; } - return (sliceFactor2 / sliceFactor1) > 1.5d; - + return (currentSliceFactor / proposedNewSliceFactor) > 1.5d; } public void removeGroup(final String groupIdentifier) { @@ -117,18 +112,17 @@ public class AbstractCompositeShape extends AbstractShape { public List getGroup(final String groupIdentifier) { return originalSubShapes.stream().filter( - subShape -> subShape.matchesGroup(groupIdentifier)) + subShape -> subShape.matchesGroup(groupIdentifier)) .collect(Collectors.toList()); } private void resliceIfNeeded() { - final double proposedSliceFactor = relativityTracker - .proposeSliceFactor(); + final double proposedSliceFactor = relativityTracker.proposeSliceFactor(); if (isReslicingNeeded(proposedSliceFactor, currentSliceFactor)) { currentSliceFactor = proposedSliceFactor; - slice(); + reslice(); } } @@ -175,13 +169,13 @@ public class AbstractCompositeShape extends AbstractShape { }); } - private void slice() { + private void reslice() { slicingOutdated = false; final List result = new ArrayList<>(); final Slicer slicer = new Slicer(currentSliceFactor); - originalSubShapes.stream().filter(subShape -> subShape.isVisible()).forEach(subShape -> { + originalSubShapes.stream().filter(SubShape::isVisible).forEach(subShape -> { if (subShape.getShape() instanceof TexturedPolygon) slicer.slice((TexturedPolygon) subShape.getShape()); else @@ -194,7 +188,7 @@ public class AbstractCompositeShape extends AbstractShape { } @Override - public void transform(final TransformsPipeline transformPipe, + public void transform(final TransformsStack transformPipe, final RenderAggregator aggregator, final RenderingContext context) { // add current composite shape transform to the end of the transform