/*
- * Sixth 3D engine. Copyright ©2012-2018, 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.basic;
import eu.svjatoslav.sixth.e3d.geometry.Point2D;
public class ForwardOrientedTexture extends AbstractCoordinateShape {
- private static final double SIZE_MULTIPLIER = 0.005;
- public Texture texture;
+ private static final double SCALE_MULTIPLIER = 0.005;
+ public final Texture texture;
+
+ /**
+ * Scale of the texture object.
+ *
+ * Object rendered visible size on the screen depends on underlying texture size and scale.
+ *
+ * 0 means that object will be infinitely small.
+ * 1 in recommended value to maintain sharpness of the texture as seen by the viewer.
+ */
private double scale;
public ForwardOrientedTexture(final Point3D point, final double scale,
setScale(scale);
}
+ /**
+ * Paint the texture on the screen (targetRenderingArea)
+ *
+ * @param targetRenderingArea the screen to paint on
+ */
@Override
public void paint(final RenderingContext targetRenderingArea) {
+ // distance from camera/viewer to center of the texture
final double z = coordinates[0].transformedCoordinate.z;
+ // compute forward oriented texture visible distance from center
final double visibleHorizontalDistanceFromCenter = (targetRenderingArea.width
- * scale * texture.primaryBitmap.width)
- / z;
+ * scale * texture.primaryBitmap.width) / z;
final double visibleVerticalDistanceFromCenter = (targetRenderingArea.width
- * scale * texture.primaryBitmap.height)
- / z;
+ * scale * texture.primaryBitmap.height) / z;
// compute visible pixel density, and get appropriate bitmap
final double zoom = (visibleHorizontalDistanceFromCenter * 2)
final TextureBitmap textureBitmap = texture.getZoomedBitmap(zoom);
- final Point2D onScreenLocation = coordinates[0].onScreenCoordinate;
+ final Point2D onScreenCoordinate = coordinates[0].onScreenCoordinate;
// compute Y
- final int initialYStart = (int) (onScreenLocation.y - visibleVerticalDistanceFromCenter);
- final int initialYEnd = (int) (onScreenLocation.y + visibleVerticalDistanceFromCenter);
- final int maxYDistance = initialYEnd - initialYStart;
+ final int onScreenUncappedYStart = (int) (onScreenCoordinate.y - visibleVerticalDistanceFromCenter);
+ final int onScreenUncappedYEnd = (int) (onScreenCoordinate.y + visibleVerticalDistanceFromCenter);
+ final int onScreenUncappedHeight = onScreenUncappedYEnd - onScreenUncappedYStart;
- int yStart = initialYStart;
- int yEnd = initialYEnd;
+ int onScreenCappedYStart = onScreenUncappedYStart;
+ int onScreenCappedYEnd = onScreenUncappedYEnd;
- if (yStart < 0)
- yStart = 0;
+ // cap Y to upper screen border
+ if (onScreenCappedYStart < 0)
+ onScreenCappedYStart = 0;
- if (yEnd > targetRenderingArea.height)
- yEnd = targetRenderingArea.height;
+ // cap Y to lower screen border
+ if (onScreenCappedYEnd > targetRenderingArea.height)
+ onScreenCappedYEnd = targetRenderingArea.height;
// compute X
- final int initialXStart = (int) (onScreenLocation.x - visibleHorizontalDistanceFromCenter);
- final int initialXEnd = (int) (onScreenLocation.x + visibleHorizontalDistanceFromCenter);
- final int maxXDistance = initialXEnd - initialXStart;
-
- int xStart = initialXStart;
- int xEnd = initialXEnd;
+ final int onScreenUncappedXStart = (int) (onScreenCoordinate.x - visibleHorizontalDistanceFromCenter);
+ final int onScreenUncappedXEnd = (int) (onScreenCoordinate.x + visibleHorizontalDistanceFromCenter);
+ final int onScreenUncappedWidth = onScreenUncappedXEnd - onScreenUncappedXStart;
- if (xStart < 0)
- xStart = 0;
+ // cap X to left screen border
+ int onScreenCappedXStart = onScreenUncappedXStart;
+ if (onScreenCappedXStart < 0)
+ onScreenCappedXStart = 0;
- if (xEnd > targetRenderingArea.width)
- xEnd = targetRenderingArea.width;
+ // cap X to right screen border
+ int onScreenCappedXEnd = onScreenUncappedXEnd;
+ if (onScreenCappedXEnd > targetRenderingArea.width)
+ onScreenCappedXEnd = targetRenderingArea.width;
final byte[] targetRenderingAreaBytes = targetRenderingArea.pixels;
final int textureWidth = textureBitmap.width;
- for (int y = yStart; y < yEnd; y++) {
+ for (int y = onScreenCappedYStart; y < onScreenCappedYEnd; y++) {
- final int relativeTextureOffset = ((textureBitmap.height * (y - initialYStart)) / maxYDistance)
+ final int sourceBitmapScanlinePixel = ((textureBitmap.height * (y - onScreenUncappedYStart)) / onScreenUncappedHeight)
* textureWidth;
- int targetRenderingAreaOffset = ((y * targetRenderingArea.width) + xStart) * 4;
+ int targetRenderingAreaOffset = ((y * targetRenderingArea.width) + onScreenCappedXStart) * 4;
- for (int x = xStart; x < xEnd; x++) {
+ for (int x = onScreenCappedXStart; x < onScreenCappedXEnd; x++) {
- final int textureOffset = (relativeTextureOffset + ((textureWidth * (x - initialXStart)) / maxXDistance)) * 4;
+ final int sourceBitmapPixelAddress = (sourceBitmapScanlinePixel + ((textureWidth * (x - onScreenUncappedXStart)) / onScreenUncappedWidth)) * 4;
- textureBitmap.drawPixel(textureOffset,
- targetRenderingAreaBytes, targetRenderingAreaOffset);
+ textureBitmap.drawPixel(sourceBitmapPixelAddress, targetRenderingAreaBytes, targetRenderingAreaOffset);
targetRenderingAreaOffset += 4;
}
}
}
+ /**
+ * Set the scale of the texture
+ *
+ * @param scale the scale of the texture
+ */
public void setScale(final double scale) {
- this.scale = scale * SIZE_MULTIPLIER;
+ this.scale = scale * SCALE_MULTIPLIER;
}
public Point3D getLocation() {