1- import { build_color_table , build_color_text } from "./to_html" ;
2- import { generate_trash_data } from "./image" ;
1+ import { build_3d_svg } from "./to_html" ;
2+ import { mat4 , vec3 } from "./math/types" ;
3+ import { PrimitiveAssembler } from "./rendering/primitive_assembler" ;
4+ import { identity , look_at , perspective , rotate , translate } from "./math/transformations" ;
5+ import { transform_vertex } from "./rendering/vertex" ;
6+ import { rasterize } from "./rendering/rasterizer" ;
7+ import { create_sphere } from "./rendering/primitives" ;
38
49
5- export function main ( ) {
10+
11+ export function main_3d ( ) {
612 const target = document . getElementById ( 'container' ) ;
7- const width_el = document . getElementById ( 'width' ) as HTMLInputElement | null ;
8- const height_el = document . getElementById ( 'height' ) as HTMLInputElement | null ;
9- const cell_size_el = document . getElementById ( 'cell-size' ) as HTMLInputElement | null ;
10-
11- const width : number = width_el ?. valueAsNumber ?? 1 ;
12- const height : number = height_el ?. valueAsNumber ?? 1 ;
13- const cell_size : number = cell_size_el ?. valueAsNumber ?? 2 ;
14-
15- const image_data = generate_trash_data ( width , height ) ;
16- const table_html = build_color_table ( image_data , cell_size ) ;
17- //const text_html = build_color_text(image_data, "■");
18- if ( ! target ) {
19- return ;
13+ if ( ! target ) return ;
14+ const wireframe_el = document . getElementById ( 'wireframe-mode' ) as HTMLInputElement ;
15+ const do_wireframe :boolean = wireframe_el ?. checked ;
16+ const sun_mesh = create_sphere ( 1.5 , 16 , 16 ) ;
17+ const planet_mesh = create_sphere ( 0.5 , 12 , 12 ) ;
18+
19+ const assembler = new PrimitiveAssembler ( 12000 ) ;
20+
21+ const aspect = 400 / 300 ;
22+ const proj_mat = perspective ( 60 * Math . PI / 180 , aspect , 0.1 , 100 ) ;
23+ const view_mat = look_at (
24+ vec3 ( 0 , 2 , 6.5 ) ,
25+ vec3 ( 0 , 0 , 0 ) ,
26+ vec3 ( 0 , 1 , 0 )
27+ ) ;
28+ let time = 0 ;
29+ const loop = ( ) => {
30+ time += 0.01 ;
31+
32+ let frame_html = "" ;
33+ let sun_model = identity ( ) ;
34+ sun_model = rotate ( sun_model , time * 0.5 , vec3 ( 0 , 1 , 0 ) ) ;
35+ frame_html += process_object ( sun_mesh , sun_model ) ;
36+ let planet_model = identity ( ) ;
37+ planet_model = rotate ( planet_model , time , vec3 ( 0 , 1 , 0 ) ) ;
38+ planet_model = translate ( planet_model , vec3 ( 3.5 , 0 , 0 ) ) ;
39+ planet_model = rotate ( planet_model , time * 3 , vec3 ( 1 , 0 , 1 ) ) ;
40+ frame_html += process_object ( planet_mesh , planet_model ) ;
41+
42+ target ! . innerHTML = frame_html ;
43+ requestAnimationFrame ( loop ) ;
44+ }
45+
46+ const process_object = ( mesh : { vertices : Float32Array , indices : Uint16Array } , model : mat4 ) => {
47+ const vertex_count = mesh . vertices . length / 3 ;
48+ const projected_buffer = new Float32Array ( vertex_count * 4 ) ;
49+
50+ for ( let i = 0 ; i < vertex_count ; i ++ ) {
51+ const x = mesh . vertices [ i * 3 + 0 ] ;
52+ const y = mesh . vertices [ i * 3 + 1 ] ;
53+ const z = mesh . vertices [ i * 3 + 2 ] ;
54+
55+ const v_clip = transform_vertex ( proj_mat , view_mat , model , vec3 ( x , y , z ) ) ;
56+
57+ projected_buffer [ i * 4 + 0 ] = v_clip [ 0 ] ;
58+ projected_buffer [ i * 4 + 1 ] = v_clip [ 1 ] ;
59+ projected_buffer [ i * 4 + 2 ] = v_clip [ 2 ] ;
60+ projected_buffer [ i * 4 + 3 ] = v_clip [ 3 ] ;
61+ }
62+
63+ const assembled = assembler . assemble_primitives ( projected_buffer , mesh . indices ) ;
64+
65+ const screen_verts = rasterize ( assembled , true ) ;
66+ return build_3d_svg ( screen_verts , do_wireframe ) ;
2067 }
21- target . innerHTML = table_html ;
68+ requestAnimationFrame ( loop ) ;
2269}
2370
24- document . getElementById ( 'render' ) ?. addEventListener ( 'click' , main ) ;
71+ document . getElementById ( 'render' ) ?. addEventListener ( 'click' , main_3d ) ;
0 commit comments