@@ -7,17 +7,26 @@ public class Object3D {
7
7
protected float [] vert ;
8
8
protected int [] index ;
9
9
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
+
11
21
12
22
public void transform (Matrix m ) {
13
23
for (int i = 0 ; i < vert .length ; i += 3 ) {
14
24
m .mult3 (vert , i , tVert , i );
15
25
}
16
26
}
17
27
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 ) {
21
30
case 0 :
22
31
raster_height (s , zbuff , img , width , height );
23
32
break ;
@@ -34,45 +43,45 @@ public void render(SurfaceGen s, int type, float[] zbuff, int[] img, int width,
34
43
}
35
44
36
45
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 ) {
38
47
for (int i = 0 ; i < index .length ; i += 3 ) {
39
48
int p1 = index [i ];
40
49
int p2 = index [i + 1 ];
41
50
int p3 = index [i + 2 ];
42
51
43
52
float height = (vert [p1 + 2 ] + vert [p3 + 2 ] + vert [p2 + 2 ]) / 3 ;
44
53
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 ],
46
55
tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
47
56
tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
48
57
tVert [p3 + 2 ]);
49
58
50
- SurfaceGen .drawline (zbuff , img , s .lineColor , w , h ,
59
+ Scene3D .drawline (zbuff , img , s .lineColor , w , h ,
51
60
tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ] - 0.01f ,
52
61
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 ,
54
63
tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ] - 0.01f ,
55
64
tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ] - 0.01f );
56
65
}
57
66
}
58
67
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 ) {
60
69
for (int i = 0 ; i < index .length ; i += 3 ) {
61
70
int p1 = index [i ];
62
71
int p2 = index [i + 1 ];
63
72
int p3 = index [i + 2 ];
64
73
float height = (vert [p1 + 2 ] + vert [p3 + 2 ] + vert [p2 + 2 ]) / 3 ;
65
74
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 ],
68
77
tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
69
78
tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
70
79
tVert [p3 + 2 ]);
71
80
}
72
81
}
73
82
74
83
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 ) {
76
85
for (int i = 0 ; i < index .length ; i += 3 ) {
77
86
int p1 = index [i ];
78
87
int p2 = index [i + 1 ];
@@ -85,30 +94,30 @@ void raster_color(SurfaceGen s, float[] zbuff, int[] img, int w, int h) {
85
94
float bright = Math .max (0 , defuse );
86
95
float hue = (float ) Math .sqrt (height );
87
96
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 ],
90
99
tVert [p1 + 2 ], tVert [p2 ], tVert [p2 + 1 ],
91
100
tVert [p2 + 2 ], tVert [p3 ], tVert [p3 + 1 ],
92
101
tVert [p3 + 2 ]);
93
102
}
94
103
}
95
104
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 ) {
97
106
for (int i = 0 ; i < index .length ; i += 3 ) {
98
107
int p1 = index [i ];
99
108
int p2 = index [i + 1 ];
100
109
int p3 = index [i + 2 ];
101
110
102
- SurfaceGen .triangle (zBuff , img , s .background , w , h ,
111
+ Scene3D .triangle (zBuff , img , s .background , w , h ,
103
112
tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
104
113
tVert [p2 ], tVert [p2 + 1 ], tVert [p2 + 2 ],
105
114
tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ]);
106
115
107
- SurfaceGen .drawline (zBuff , img , s .lineColor , w , h ,
116
+ Scene3D .drawline (zBuff , img , s .lineColor , w , h ,
108
117
tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
109
118
tVert [p2 ], tVert [p2 + 1 ], tVert [p2 + 2 ]);
110
119
111
- SurfaceGen .drawline (zBuff , img , s .lineColor , w , h ,
120
+ Scene3D .drawline (zBuff , img , s .lineColor , w , h ,
112
121
tVert [p1 ], tVert [p1 + 1 ], tVert [p1 + 2 ],
113
122
tVert [p3 ], tVert [p3 + 1 ], tVert [p3 + 2 ]);
114
123
}
@@ -120,120 +129,26 @@ public double[] center() {
120
129
};
121
130
return look_point ;
122
131
}
132
+
123
133
public float centerX () {
124
134
return (mMaxX + mMinX ) / 2 ;
125
135
}
136
+
126
137
public float centerY () {
127
- return (mMaxY + mMinY ) / 2 ;
138
+ return (mMaxY + mMinY ) / 2 ;
128
139
}
140
+
129
141
public float rangeX () {
130
- return (mMaxX - mMinX ) / 2 ;
142
+ return (mMaxX - mMinX ) / 2 ;
131
143
}
144
+
132
145
public float rangeY () {
133
- return (mMaxY - mMinY ) / 2 ;
146
+ return (mMaxY - mMinY ) / 2 ;
134
147
}
148
+
135
149
public double size () {
136
150
137
151
return Math .hypot ((mMaxX - mMinX ), Math .hypot ((mMaxY - mMinY ), (mMaxZ - mMinZ ))) / 2 ;
138
152
}
139
153
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
- }
239
154
}
0 commit comments