2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
5 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic;
7 import eu.svjatoslav.sixth.e3d.geometry.Point2D;
8 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
9 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
10 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.AbstractCoordinateShape;
11 import eu.svjatoslav.sixth.e3d.renderer.raster.texture.Texture;
12 import eu.svjatoslav.sixth.e3d.renderer.raster.texture.TextureBitmap;
14 public class ForwardOrientedTexture extends AbstractCoordinateShape {
16 private static final double SIZE_MULTIPLIER = 0.005;
17 public final Texture texture;
20 public ForwardOrientedTexture(final Point3D point, final double scale,
21 final Texture texture) {
23 this.texture = texture;
28 public void paint(final RenderingContext targetRenderingArea) {
30 final double z = coordinates[0].transformedCoordinate.z;
32 final double visibleHorizontalDistanceFromCenter = (targetRenderingArea.width
33 * scale * texture.primaryBitmap.width)
36 final double visibleVerticalDistanceFromCenter = (targetRenderingArea.width
37 * scale * texture.primaryBitmap.height)
40 // compute visible pixel density, and get appropriate bitmap
41 final double zoom = (visibleHorizontalDistanceFromCenter * 2)
42 / texture.primaryBitmap.width;
44 final TextureBitmap textureBitmap = texture.getZoomedBitmap(zoom);
46 final Point2D onScreenLocation = coordinates[0].onScreenCoordinate;
49 final int initialYStart = (int) (onScreenLocation.y - visibleVerticalDistanceFromCenter);
50 final int initialYEnd = (int) (onScreenLocation.y + visibleVerticalDistanceFromCenter);
51 final int maxYDistance = initialYEnd - initialYStart;
53 int yStart = initialYStart;
54 int yEnd = initialYEnd;
59 if (yEnd > targetRenderingArea.height)
60 yEnd = targetRenderingArea.height;
63 final int initialXStart = (int) (onScreenLocation.x - visibleHorizontalDistanceFromCenter);
64 final int initialXEnd = (int) (onScreenLocation.x + visibleHorizontalDistanceFromCenter);
65 final int maxXDistance = initialXEnd - initialXStart;
67 int xStart = initialXStart;
68 int xEnd = initialXEnd;
73 if (xEnd > targetRenderingArea.width)
74 xEnd = targetRenderingArea.width;
76 final byte[] targetRenderingAreaBytes = targetRenderingArea.pixels;
78 final int textureWidth = textureBitmap.width;
80 for (int y = yStart; y < yEnd; y++) {
82 final int relativeTextureOffset = ((textureBitmap.height * (y - initialYStart)) / maxYDistance)
85 int targetRenderingAreaOffset = ((y * targetRenderingArea.width) + xStart) * 4;
87 for (int x = xStart; x < xEnd; x++) {
89 final int textureOffset = (relativeTextureOffset + ((textureWidth * (x - initialXStart)) / maxXDistance)) * 4;
91 textureBitmap.drawPixel(textureOffset,
92 targetRenderingAreaBytes, targetRenderingAreaOffset);
94 targetRenderingAreaOffset += 4;
99 public void setScale(final double scale) {
100 this.scale = scale * SIZE_MULTIPLIER;
103 public Point3D getLocation() {
104 return coordinates[0].coordinate;