2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
8 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic;
10 import eu.svjatoslav.sixth.e3d.geometry.Point2D;
11 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
12 import eu.svjatoslav.sixth.e3d.gui.RenderingContext;
13 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.AbstractCoordinateShape;
14 import eu.svjatoslav.sixth.e3d.renderer.raster.texture.Texture;
15 import eu.svjatoslav.sixth.e3d.renderer.raster.texture.TextureBitmap;
17 public class ForwardOrientedTexture extends AbstractCoordinateShape {
19 private static final double SIZE_MULTIPLIER = 0.005;
20 public final Texture texture;
23 public ForwardOrientedTexture(final Point3D point, final double scale,
24 final Texture texture) {
26 this.texture = texture;
31 public void paint(final RenderingContext targetRenderingArea) {
33 final double z = coordinates[0].transformedCoordinate.z;
35 final double visibleHorizontalDistanceFromCenter = (targetRenderingArea.width
36 * scale * texture.primaryBitmap.width)
39 final double visibleVerticalDistanceFromCenter = (targetRenderingArea.width
40 * scale * texture.primaryBitmap.height)
43 // compute visible pixel density, and get appropriate bitmap
44 final double zoom = (visibleHorizontalDistanceFromCenter * 2)
45 / texture.primaryBitmap.width;
47 final TextureBitmap textureBitmap = texture.getZoomedBitmap(zoom);
49 final Point2D onScreenLocation = coordinates[0].onScreenCoordinate;
52 final int initialYStart = (int) (onScreenLocation.y - visibleVerticalDistanceFromCenter);
53 final int initialYEnd = (int) (onScreenLocation.y + visibleVerticalDistanceFromCenter);
54 final int maxYDistance = initialYEnd - initialYStart;
56 int yStart = initialYStart;
57 int yEnd = initialYEnd;
62 if (yEnd > targetRenderingArea.height)
63 yEnd = targetRenderingArea.height;
66 final int initialXStart = (int) (onScreenLocation.x - visibleHorizontalDistanceFromCenter);
67 final int initialXEnd = (int) (onScreenLocation.x + visibleHorizontalDistanceFromCenter);
68 final int maxXDistance = initialXEnd - initialXStart;
70 int xStart = initialXStart;
71 int xEnd = initialXEnd;
76 if (xEnd > targetRenderingArea.width)
77 xEnd = targetRenderingArea.width;
79 final byte[] targetRenderingAreaBytes = targetRenderingArea.pixels;
81 final int textureWidth = textureBitmap.width;
83 for (int y = yStart; y < yEnd; y++) {
85 final int relativeTextureOffset = ((textureBitmap.height * (y - initialYStart)) / maxYDistance)
88 int targetRenderingAreaOffset = ((y * targetRenderingArea.width) + xStart) * 4;
90 for (int x = xStart; x < xEnd; x++) {
92 final int textureOffset = (relativeTextureOffset + ((textureWidth * (x - initialXStart)) / maxXDistance)) * 4;
94 textureBitmap.drawPixel(textureOffset,
95 targetRenderingAreaBytes, targetRenderingAreaOffset);
97 targetRenderingAreaOffset += 4;
102 public void setScale(final double scale) {
103 this.scale = scale * SIZE_MULTIPLIER;
106 public Point3D getLocation() {
107 return coordinates[0].coordinate;