@@ -4,9 +4,9 @@ use minifb::{Key, KeyRepeat};
44
55use re:: prelude:: * ;
66
7- use re:: core:: geom:: Polyline ;
7+ use re:: core:: geom:: { Edge , Polyline , Ray } ;
88use re:: core:: math:: { ProjMat3 , ProjVec3 , color:: gray} ;
9- use re:: core:: render:: cam:: Fov ;
9+ use re:: core:: render:: { cam:: Fov , debug :: DbgBatch } ;
1010
1111use re:: front:: { Frame , minifb:: Window } ;
1212use re:: geom:: { io:: parse_obj, solids:: * } ;
@@ -62,7 +62,7 @@ fn main() {
6262 . viewport ( pt2 ( 10 , h - 10 ) ..pt2 ( w - 10 , 10 ) ) ;
6363
6464 type VertexIn = Vertex3 < Normal3 > ;
65- type VertexOut = Vertex < ProjVec3 , Color3f > ;
65+ type VertexOut = Vertex < ProjVec3 , Color4f > ;
6666 type Uniform < ' a > = ( & ' a ProjMat3 < Model > , & ' a Mat4 ) ;
6767
6868 fn vtx_shader ( v : VertexIn , ( mvp, spin) : Uniform ) -> VertexOut {
@@ -71,12 +71,11 @@ fn main() {
7171 // Calculate diffuse shading
7272 let diffuse = ( norm. z ( ) + 0.2 ) . max ( 0.2 ) * 0.8 ;
7373 // Visualize normal by mapping to RGB values
74- let [ r, g, b] = ( 0.45 * ( v. attrib + splat ( 1.1 ) ) ) . 0 ;
75- let col = diffuse * rgb ( r, g, b) ;
74+ let col = diffuse * debug:: dir_to_rgb ( norm) ;
7675 vertex ( mvp. apply ( & v. pos ) , col)
7776 }
7877
79- fn frag_shader ( f : Frag < Color3f > ) -> Color4 {
78+ fn frag_shader ( f : Frag < Color4f > ) -> Color4 {
8079 f. var . to_color4 ( )
8180 }
8281
@@ -86,6 +85,8 @@ fn main() {
8685
8786 let translate = translate ( -3.0 * Vec3 :: Z ) ;
8887 let mut carousel = Carousel :: default ( ) ;
88+ let mut debug: u8 = 0 ;
89+ let mut hide_model = false ;
8990
9091 win. run ( |frame| {
9192 let Frame { t, dt, win, .. } = frame;
@@ -94,30 +95,78 @@ fn main() {
9495 if win. imp . is_key_pressed ( Key :: Space , KeyRepeat :: No ) {
9596 carousel. start ( ) ;
9697 }
98+ if win. imp . is_key_pressed ( Key :: D , KeyRepeat :: No ) {
99+ debug = ( debug + 1 ) % 6 ;
100+ }
101+ if win. imp . is_key_pressed ( Key :: H , KeyRepeat :: No ) {
102+ hide_model = !hide_model;
103+ }
97104
98105 let theta = rads ( t. as_secs_f32 ( ) ) ;
99106 let spin = rotate_x ( theta * 0.37 ) . then ( & rotate_y ( theta * 0.51 ) ) ;
100107 let carouse = carousel. update ( dt. as_secs_f32 ( ) ) ;
101108
102109 // Compose transform stack
103- let model_view_project : ProjMat3 < Model > = spin
110+ let mvp : ProjMat3 < Model > = spin
104111 . then ( & translate)
105112 . then ( & carouse)
106113 . to :: < ModelToWorld > ( )
107114 . then ( & cam. world_to_project ( ) ) ;
108115
109116 let object = & objects[ carousel. idx % objects. len ( ) ] ;
110117
111- Batch {
112- prims : object. faces . clone ( ) ,
113- verts : object. verts . clone ( ) ,
114- uniform : ( & model_view_project, & spin) ,
115- shader : shader,
116- viewport : cam. viewport ,
117- target : frame. buf ,
118- ctx : & * frame. ctx ,
118+ if !hide_model {
119+ Batch {
120+ prims : object. faces . clone ( ) ,
121+ verts : object. verts . clone ( ) ,
122+ uniform : ( & mvp, & spin) ,
123+ shader : shader,
124+ viewport : cam. viewport ,
125+ target : frame. buf ,
126+ ctx : & * frame. ctx ,
127+ } . render ( ) ;
128+ }
129+
130+ let mut dbg_batch = DbgBatch :: default ( ) ;
131+ if debug > 0 {
132+ let bbox = debug:: bbox ( & object. verts ) ;
133+ dbg_batch. append ( bbox) ;
134+ }
135+ if debug > 1 {
136+ let sphere = debug:: sphere :: < Model > ( pt3 ( 0.0 , 0.0 , 0.0 ) , 1.0 ) ;
137+ dbg_batch. append ( sphere) ;
138+ }
139+ if debug > 2 {
140+ let basis = debug:: basis ( Mat4 :: < _ > :: identity ( ) ) ;
141+ dbg_batch. append ( basis) ;
119142 }
120- . render ( ) ;
143+ if debug > 3 {
144+ // Wireframe faces
145+ let edges: Vec < _ > = object
146+ . faces
147+ . iter ( )
148+ . flat_map ( |tri| tri. edges ( ) . map ( |Edge ( a, b) | Edge ( * a, * b) ) )
149+ . collect ( ) ;
150+ let verts: Vec < _ > = object
151+ . verts
152+ . iter ( )
153+ . map ( |v| vertex ( v. pos , gray ( 1.0f32 ) . to_rgba ( ) ) )
154+ . collect ( ) ;
155+
156+ dbg_batch. append ( DbgBatch :: new ( & edges, & verts) ) ;
157+ }
158+ if debug > 4 {
159+ for Tri ( vs) in object. faces ( ) {
160+ let norm = debug:: face_normal ( Tri ( vs. map ( |& v| v) ) ) ;
161+ dbg_batch. append ( norm) ;
162+ }
163+ }
164+ dbg_batch
165+ . uniform ( & mvp)
166+ . viewport ( cam. viewport )
167+ . context ( & * frame. ctx )
168+ . target ( & mut frame. buf )
169+ . render ( ) ;
121170
122171 Continue ( ( ) )
123172 } ) ;
@@ -135,6 +184,7 @@ fn objects_n(res: u32) -> [Mesh<Normal3>; 14] {
135184 let major_sectors = 3 * res;
136185 let minor_sectors = 2 * res;
137186 [
187+ lathe ( sectors) ,
138188 // The five Platonic solids
139189 Tetrahedron . build ( ) ,
140190 Cube { side_len : 1.25 } . build ( ) ,
@@ -143,7 +193,6 @@ fn objects_n(res: u32) -> [Mesh<Normal3>; 14] {
143193 Icosahedron . build ( ) ,
144194
145195 // Surfaces of revolution
146- lathe ( sectors) ,
147196 Sphere { radius : 1.0 , sectors, segments, } . build ( ) ,
148197 Cylinder { radius : 0.8 , sectors, segments, capped : true } . build ( ) ,
149198 Cone { base_radius : 1.1 , apex_radius : 0.3 , sectors, segments, capped : true } . build ( ) ,
@@ -159,16 +208,59 @@ fn objects_n(res: u32) -> [Mesh<Normal3>; 14] {
159208
160209// Creates a Lathe mesh.
161210fn lathe ( secs : u32 ) -> Mesh < Normal3 > {
162- let pts = [
163- ( pt2 ( 0.75 , -0.5 ) , vec2 ( 1.0 , 1.0 ) ) ,
164- ( pt2 ( 0.55 , -0.25 ) , vec2 ( 1.0 , 0.5 ) ) ,
165- ( pt2 ( 0.5 , 0.0 ) , vec2 ( 1.0 , 0.0 ) ) ,
166- ( pt2 ( 0.55 , 0.25 ) , vec2 ( 1.0 , -0.5 ) ) ,
167- ( pt2 ( 0.75 , 0.5 ) , vec2 ( 1.0 , -1.0 ) ) ,
168- ]
169- . map ( |( p, n) | vertex ( p, n. normalize ( ) ) ) ;
170-
171- Lathe :: new ( Polyline :: new ( pts) , secs, pts. len ( ) as u32 )
211+ let _pts: [ Vertex < Point2 , Normal2 > ; _] = [
212+ // _________
213+ // |
214+ // /
215+ // ____/
216+ // /
217+ // |
218+ // \______
219+ // _______\
220+
221+ // Base
222+ vertex ( pt2 ( 0.5 , -0.6 ) , vec2 ( 1.0 , 0.0 ) ) ,
223+ vertex ( pt2 ( 0.45 , -0.55 ) , vec2 ( 0.0 , 1.0 ) ) ,
224+ // Neck
225+ vertex ( pt2 ( 0.15 , -0.5 ) , vec2 ( 1.0 , 1.0 ) ) ,
226+ vertex ( pt2 ( 0.1 , -0.45 ) , vec2 ( 1.0 , 0.0 ) ) ,
227+ vertex ( pt2 ( 0.1 , 0.0 ) , vec2 ( 1.0 , 0.0 ) ) ,
228+ vertex ( pt2 ( 0.15 , 0.05 ) , vec2 ( 1.0 , -1.0 ) ) ,
229+ // Bowl outer
230+ vertex ( pt2 ( 0.4 , 0.1 ) , vec2 ( 1.0 , -0.5 ) ) ,
231+ vertex ( pt2 ( 0.5 , 0.2 ) , vec2 ( 1.0 , 0.0 ) ) ,
232+ vertex ( pt2 ( 0.5 , 0.3 ) , vec2 ( 1.0 , 0.0 ) ) ,
233+ vertex ( pt2 ( 0.4 , 0.6 ) , vec2 ( 1.0 , 0.1 ) ) ,
234+ // Bowl inner
235+ vertex ( pt2 ( 0.35 , 0.6 ) , vec2 ( -1.0 , 0.1 ) ) ,
236+ vertex ( pt2 ( 0.4 , 0.25 ) , vec2 ( -1.0 , 0.0 ) ) ,
237+ vertex ( pt2 ( 0.2 , 0.15 ) , vec2 ( -0.2 , 1.0 ) ) ,
238+ vertex ( pt2 ( 0.0 , 0.1 ) , vec2 ( 0.0 , 1.0 ) ) ,
239+ ] ;
240+
241+ let curve = BezierSpline :: from_rays (
242+ [
243+ Ray ( pt2 ( 0.5 , -0.6 ) , vec2 ( 0.0 , 0.1 ) ) ,
244+ Ray ( pt2 ( 0.4 , -0.55 ) , vec2 ( -0.1 , 0.0 ) ) ,
245+ Ray ( pt2 ( 0.1 , -0.4 ) , vec2 ( 0.0 , 0.1 ) ) ,
246+ Ray ( pt2 ( 0.1 , 0.0 ) , vec2 ( 0.0 , 0.1 ) ) ,
247+ Ray ( pt2 ( 0.3 , 0.2 ) , vec2 ( 0.1 , 0.0 ) ) ,
248+ Ray ( pt2 ( 0.5 , 0.4 ) , vec2 ( 0.0 , 0.1 ) ) ,
249+ Ray ( pt2 ( 0.4 , 1.0 ) , vec2 ( -0.1 , 0.0 ) ) ,
250+ Ray ( pt2 ( 0.48 , 0.4 ) , vec2 ( 0.0 , -0.1 ) ) ,
251+ Ray ( pt2 ( 0.0 , 0.05 ) , vec2 ( -0.1 , 0.0 ) ) ,
252+ ] , //.map(|Ray(pos, dir)| Ray(vertex(pos, dir.perp().normalize()))),
253+ ) ;
254+
255+ let curve: Vec < _ > = curve
256+ . approximate ( 0.05 )
257+ . 0
258+ . into_iter ( )
259+ . map ( |p| vertex ( p, vec2 ( 1.0 , 1.0 ) ) )
260+ . collect ( ) ;
261+
262+ let n = curve. len ( ) ;
263+ Lathe :: new ( Polyline ( curve) , secs, 2 * n as u32 )
172264 . capped ( true )
173265 . build ( )
174266}
0 commit comments