X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Frenderer%2Fraster%2Fshapes%2Fbasic%2FForwardOrientedTexture.java;h=3f9f084b19d1c51780ef9d91a3dbcc96b99dca22;hb=a3ff3683bd0a025061667b26b6fcf56fe20f0afc;hp=30255969312a8589ccdbf73f9097cb981a76d3e4;hpb=03447008b8ee26a6463d2cd03005dc26464863db;p=sixth-3d.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/basic/ForwardOrientedTexture.java b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/basic/ForwardOrientedTexture.java index 3025596..3f9f084 100644 --- a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/basic/ForwardOrientedTexture.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/basic/ForwardOrientedTexture.java @@ -1,12 +1,7 @@ /* - * 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.basic; import eu.svjatoslav.sixth.e3d.geometry.Point2D; @@ -18,8 +13,17 @@ import eu.svjatoslav.sixth.e3d.renderer.raster.texture.TextureBitmap; public class ForwardOrientedTexture extends AbstractCoordinateShape { - public 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, @@ -29,18 +33,23 @@ public class ForwardOrientedTexture extends AbstractCoordinateShape { 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) @@ -48,61 +57,72 @@ public class ForwardOrientedTexture extends AbstractCoordinateShape { 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.bytes; + 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() { + return coordinates[0].coordinate; } }