@@ -7,17 +7,26 @@ public class Object3D {
77 protected float [] vert ;
88 protected int [] index ;
99 protected float [] tVert ; // the vertices transformed into screen space
10- float mMinX , mMaxX , mMinY , mMaxY , mMinZ , mMaxZ ; // bounds in x,y & z
10+ protected float mMinX , mMaxX , mMinY , mMaxY , mMinZ , mMaxZ ; // bounds in x,y & z
11+ protected int mType = 2 ;
12+
13+ public int getType () {
14+ return mType ;
15+ }
16+
17+ public void setType (int type ) {
18+ this .mType = type ;
19+ }
20+
1121
1222 public void transform (Matrix m ) {
1323 for (int i = 0 ; i < vert .length ; i += 3 ) {
1424 m .mult3 (vert , i , tVert , i );
1525 }
1626 }
1727
18- public void render (SurfaceGen s , int type , float [] zbuff , int [] img , int width , int height ) {
19- System .out .println (type );
20- switch (type ) {
28+ public void render (Scene3D s , float [] zbuff , int [] img , int width , int height ) {
29+ switch (mType ) {
2130 case 0 :
2231 raster_height (s , zbuff , img , width , height );
2332 break ;
@@ -34,45 +43,45 @@ public void render(SurfaceGen s, int type, float[] zbuff, int[] img, int width,
3443 }
3544
3645
37- private void raster_lines (SurfaceGen s , float [] zbuff , int [] img , int w , int h ) {
46+ private void raster_lines (Scene3D s , float [] zbuff , int [] img , int w , int h ) {
3847 for (int i = 0 ; i < index .length ; i += 3 ) {
3948 int p1 = index [i ];
4049 int p2 = index [i + 1 ];
4150 int p3 = index [i + 2 ];
4251
4352 float height = (vert [p1 + 2 ] + vert [p3 + 2 ] + vert [p2 + 2 ]) / 3 ;
4453 int val = (int ) (255 * Math .abs (height ));
45- SurfaceGen .triangle (zbuff , img , 0x10001 * val + 0x100 * (255 - val ), w , h , tVert [p1 ], tVert [p1 + 1 ],
54+ Scene3D .triangle (zbuff , img , 0x10001 * val + 0x100 * (255 - val ), w , h , tVert [p1 ], tVert [p1 + 1 ],
4655 tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
4756 tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
4857 tVert [p3 + 2 ]);
4958
50- SurfaceGen .drawline (zbuff , img , s .lineColor , w , h ,
59+ Scene3D .drawline (zbuff , img , s .lineColor , w , h ,
5160 tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ] - 0.01f ,
5261 tVert [p2 ], tVert [p2 + 1 ], tVert [p2 + 2 ] - 0.01f );
53- SurfaceGen .drawline (zbuff , img , s .lineColor , w , h ,
62+ Scene3D .drawline (zbuff , img , s .lineColor , w , h ,
5463 tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ] - 0.01f ,
5564 tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ] - 0.01f );
5665 }
5766 }
5867
59- void raster_height (SurfaceGen s , float [] zbuff , int [] img , int w , int h ) {
68+ void raster_height (Scene3D s , float [] zbuff , int [] img , int w , int h ) {
6069 for (int i = 0 ; i < index .length ; i += 3 ) {
6170 int p1 = index [i ];
6271 int p2 = index [i + 1 ];
6372 int p3 = index [i + 2 ];
6473 float height = (vert [p1 + 2 ] + vert [p3 + 2 ] + vert [p2 + 2 ]) / 3 ;
6574 height = (height - mMinZ ) / (mMaxZ - mMinZ );
66- int col = SurfaceGen .hsvToRgb (height , Math .abs (2 * (height - 0.5f )), (float ) Math .sqrt (height ));
67- SurfaceGen .triangle (zbuff , img , col , w , h , tVert [p1 ], tVert [p1 + 1 ],
75+ int col = Scene3D .hsvToRgb (height , Math .abs (2 * (height - 0.5f )), (float ) Math .sqrt (height ));
76+ Scene3D .triangle (zbuff , img , col , w , h , tVert [p1 ], tVert [p1 + 1 ],
6877 tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
6978 tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
7079 tVert [p3 + 2 ]);
7180 }
7281 }
7382
7483
75- void raster_color (SurfaceGen s , float [] zbuff , int [] img , int w , int h ) {
84+ void raster_color (Scene3D s , float [] zbuff , int [] img , int w , int h ) {
7685 for (int i = 0 ; i < index .length ; i += 3 ) {
7786 int p1 = index [i ];
7887 int p2 = index [i + 1 ];
@@ -85,30 +94,30 @@ void raster_color(SurfaceGen s, float[] zbuff, int[] img, int w, int h) {
8594 float bright = Math .max (0 , defuse );
8695 float hue = (float ) Math .sqrt (height );
8796 float sat = Math .max (0.5f , height );
88- int col = SurfaceGen .hsvToRgb (hue , sat , bright );
89- SurfaceGen .triangle (zbuff , img , col , w , h , tVert [p1 ], tVert [p1 + 1 ],
97+ int col = Scene3D .hsvToRgb (hue , sat , bright );
98+ Scene3D .triangle (zbuff , img , col , w , h , tVert [p1 ], tVert [p1 + 1 ],
9099 tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
91100 tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
92101 tVert [p3 + 2 ]);
93102 }
94103 }
95104
96- void raster_outline (SurfaceGen s , float [] zBuff , int [] img , int w , int h ) {
105+ void raster_outline (Scene3D s , float [] zBuff , int [] img , int w , int h ) {
97106 for (int i = 0 ; i < index .length ; i += 3 ) {
98107 int p1 = index [i ];
99108 int p2 = index [i + 1 ];
100109 int p3 = index [i + 2 ];
101110
102- SurfaceGen .triangle (zBuff , img , s .background , w , h ,
111+ Scene3D .triangle (zBuff , img , s .background , w , h ,
103112 tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
104113 tVert [p2 ], tVert [p2 + 1 ], tVert [p2 + 2 ],
105114 tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ]);
106115
107- SurfaceGen .drawline (zBuff , img , s .lineColor , w , h ,
116+ Scene3D .drawline (zBuff , img , s .lineColor , w , h ,
108117 tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
109118 tVert [p2 ], tVert [p2 + 1 ], tVert [p2 + 2 ]);
110119
111- SurfaceGen .drawline (zBuff , img , s .lineColor , w , h ,
120+ Scene3D .drawline (zBuff , img , s .lineColor , w , h ,
112121 tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
113122 tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ]);
114123 }
@@ -120,120 +129,26 @@ public double[] center() {
120129 };
121130 return look_point ;
122131 }
132+
123133 public float centerX () {
124134 return (mMaxX + mMinX ) / 2 ;
125135 }
136+
126137 public float centerY () {
127- return (mMaxY + mMinY ) / 2 ;
138+ return (mMaxY + mMinY ) / 2 ;
128139 }
140+
129141 public float rangeX () {
130- return (mMaxX - mMinX ) / 2 ;
142+ return (mMaxX - mMinX ) / 2 ;
131143 }
144+
132145 public float rangeY () {
133- return (mMaxY - mMinY ) / 2 ;
146+ return (mMaxY - mMinY ) / 2 ;
134147 }
148+
135149 public double size () {
136150
137151 return Math .hypot ((mMaxX - mMinX ), Math .hypot ((mMaxY - mMinY ), (mMaxZ - mMinZ ))) / 2 ;
138152 }
139153
140- static class Surface extends Object3D {
141- final int SIZE = 100 ; // the number of point on the side total points = SIZE*SIZE
142- private Function mFunction ;
143- private float mZoomZ = 1 ;
144-
145- public interface Function {
146- float eval (float x , float y );
147- }
148-
149- public Surface (boolean resetZ , Function func ) {
150- computeSurface (resetZ , func );
151- }
152-
153- public void computeSurface (boolean resetZ , Function func ) {
154- int n = (SIZE + 1 ) * (SIZE + 1 );
155- vert = new float [n * 3 ];
156- tVert = new float [n * 3 ];
157- index = new int [SIZE * SIZE * 6 ];
158- float min_x = mMinX ;
159- float max_x = mMaxX ;
160- float min_y = mMinY ;
161- float max_y = mMaxY ;
162- float min_z = Float .MAX_VALUE ;
163- float max_z = -Float .MAX_VALUE ;
164-
165- mFunction = func ;
166- int count = 0 ;
167- for (int iy = 0 ; iy <= SIZE ; iy ++) {
168- float y = min_y + iy * (max_y - min_y ) / (SIZE );
169- for (int ix = 0 ; ix <= SIZE ; ix ++) {
170- float x = min_x + ix * (max_x - min_x ) / (SIZE );
171- vert [count ++] = x ;
172- vert [count ++] = y ;
173- float z = func .eval (x , y );
174-
175- if (Float .isNaN (z ) || Float .isInfinite (z )) {
176- float epslonX = 0.000005232f ;
177- float epslonY = 0.00000898f ;
178- z = func .eval (x + epslonX , y + epslonY );
179- }
180- vert [count ++] = z ;
181- if (Float .isNaN (z )) {
182- continue ;
183- }
184-
185- if (Float .isInfinite (z )) {
186- continue ;
187- }
188- min_z = Math .min (z , min_z );
189- max_z = Math .max (z , max_z );
190- }
191- if (resetZ ) {
192- mMinZ = min_z ;
193- mMaxZ = max_z ;
194- }
195- }
196- // normalize range in z
197- float xrange = mMaxX - mMinX ;
198- float yrange = mMaxY - mMinY ;
199- float zrange = max_z - min_z ;
200- if (zrange != 0 ) {
201- float xyrange = (xrange + yrange ) / 2 ;
202- float scalez = xyrange / zrange ;
203-
204- for (int i = 0 ; i < vert .length ; i += 3 ) {
205- float z = vert [i + 2 ];
206- if (Float .isNaN (z ) || Float .isInfinite (z )) {
207- if (i > 3 ) {
208- z = vert [i - 1 ];
209- } else {
210- z = vert [i + 5 ];
211- }
212- }
213- vert [i + 2 ] = z * scalez * mZoomZ ;
214- }
215- if (resetZ ) {
216- mMinZ *= scalez ;
217- mMaxZ *= scalez ;
218- }
219- }
220- count = 0 ;
221- for (int iy = 0 ; iy < SIZE ; iy ++) {
222- for (int ix = 0 ; ix < SIZE ; ix ++) {
223- int p1 = 3 * (ix + iy * (SIZE + 1 ));
224- int p2 = 3 * (1 + ix + iy * (SIZE + 1 ));
225- int p3 = 3 * (ix + (iy + 1 ) * (SIZE + 1 ));
226- int p4 = 3 * (1 + ix + (iy + 1 ) * (SIZE + 1 ));
227- index [count ++] = p1 ;
228- index [count ++] = p2 ;
229- index [count ++] = p3 ;
230-
231- index [count ++] = p4 ;
232- index [count ++] = p3 ;
233- index [count ++] = p2 ;
234- }
235- }
236- }
237-
238- }
239154}
0 commit comments