/*
- * Sixth 3D engine. Copyright ©2012-2016, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 3 of the GNU Lesser General Public License
- * or later as published by the Free Software Foundation.
- *
+ * 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;
import eu.svjatoslav.sixth.e3d.geometry.Point3D;
-import eu.svjatoslav.sixth.e3d.geometry.Transform;
-import eu.svjatoslav.sixth.e3d.geometry.TransformPipe;
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.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;
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<SubShape> originalSubShapes = new ArrayList<>();
private final UserRelativityTracker relativityTracker;
* This method should be overridden by anyone wanting to customize shape
* before it is rendered.
*/
- public void beforeTransformHook(final TransformPipe transformPipe,
+ public void beforeTransformHook(final TransformsStack transformPipe,
final RenderingContext context) {
}
});
}
- 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) {
public List<SubShape> 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();
}
}
}
public void setGroupForUngrouped(final String groupIdentifier) {
- originalSubShapes.stream().filter(subShape -> subShape.isUngrouped()).forEach(subShape -> subShape.setGroup(groupIdentifier));
+ originalSubShapes.stream().filter(SubShape::isUngrouped).forEach(subShape -> subShape.setGroup(groupIdentifier));
}
@Override
});
}
- private void slice() {
+ private void reslice() {
slicingOutdated = false;
final List<AbstractShape> 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
}
@Override
- public void transform(final TransformPipe transformPipe,
+ public void transform(final TransformsStack transformPipe,
final RenderAggregator aggregator, final RenderingContext context) {
// add current composite shape transform to the end of the transform