Formatting update
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / raster / shapes / basic / ForwardOrientedTexture.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko. 
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic;
6
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;
13
14 public class ForwardOrientedTexture extends AbstractCoordinateShape {
15
16     private static final double SIZE_MULTIPLIER = 0.005;
17     public final Texture texture;
18     private double scale;
19
20     public ForwardOrientedTexture(final Point3D point, final double scale,
21                                   final Texture texture) {
22         super(point);
23         this.texture = texture;
24         setScale(scale);
25     }
26
27     @Override
28     public void paint(final RenderingContext targetRenderingArea) {
29
30         final double z = coordinates[0].transformedCoordinate.z;
31
32         final double visibleHorizontalDistanceFromCenter = (targetRenderingArea.width
33                 * scale * texture.primaryBitmap.width)
34                 / z;
35
36         final double visibleVerticalDistanceFromCenter = (targetRenderingArea.width
37                 * scale * texture.primaryBitmap.height)
38                 / z;
39
40         // compute visible pixel density, and get appropriate bitmap
41         final double zoom = (visibleHorizontalDistanceFromCenter * 2)
42                 / texture.primaryBitmap.width;
43
44         final TextureBitmap textureBitmap = texture.getZoomedBitmap(zoom);
45
46         final Point2D onScreenLocation = coordinates[0].onScreenCoordinate;
47
48         // compute Y
49         final int initialYStart = (int) (onScreenLocation.y - visibleVerticalDistanceFromCenter);
50         final int initialYEnd = (int) (onScreenLocation.y + visibleVerticalDistanceFromCenter);
51         final int maxYDistance = initialYEnd - initialYStart;
52
53         int yStart = initialYStart;
54         int yEnd = initialYEnd;
55
56         if (yStart < 0)
57             yStart = 0;
58
59         if (yEnd > targetRenderingArea.height)
60             yEnd = targetRenderingArea.height;
61
62         // compute X
63         final int initialXStart = (int) (onScreenLocation.x - visibleHorizontalDistanceFromCenter);
64         final int initialXEnd = (int) (onScreenLocation.x + visibleHorizontalDistanceFromCenter);
65         final int maxXDistance = initialXEnd - initialXStart;
66
67         int xStart = initialXStart;
68         int xEnd = initialXEnd;
69
70         if (xStart < 0)
71             xStart = 0;
72
73         if (xEnd > targetRenderingArea.width)
74             xEnd = targetRenderingArea.width;
75
76         final byte[] targetRenderingAreaBytes = targetRenderingArea.pixels;
77
78         final int textureWidth = textureBitmap.width;
79
80         for (int y = yStart; y < yEnd; y++) {
81
82             final int relativeTextureOffset = ((textureBitmap.height * (y - initialYStart)) / maxYDistance)
83                     * textureWidth;
84
85             int targetRenderingAreaOffset = ((y * targetRenderingArea.width) + xStart) * 4;
86
87             for (int x = xStart; x < xEnd; x++) {
88
89                 final int textureOffset = (relativeTextureOffset + ((textureWidth * (x - initialXStart)) / maxXDistance)) * 4;
90
91                 textureBitmap.drawPixel(textureOffset,
92                         targetRenderingAreaBytes, targetRenderingAreaOffset);
93
94                 targetRenderingAreaOffset += 4;
95             }
96         }
97     }
98
99     public void setScale(final double scale) {
100         this.scale = scale * SIZE_MULTIPLIER;
101     }
102
103     public Point3D getLocation() {
104         return coordinates[0].coordinate;
105     }
106
107 }