Skip to content

Commit 401d716

Browse files
committed
Primitive assembler and rasterizer
1 parent cf7d636 commit 401d716

8 files changed

Lines changed: 108 additions & 2 deletions

File tree

src/image.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { vec3 } from "./transformer";
1+
import type { vec3 } from "./to_html";
22

33
function hsl2rgb(h:number, s:number, l:number):vec3 {
44
const f_final = (n:number) => {

src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { build_color_table, build_color_text } from "./transformer";
1+
import { build_color_table, build_color_text } from "./to_html";
22
import { generate_trash_data } from "./image";
33

44

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { ArrayType } from "../math/types";
2+
3+
export class PrimitiveAssembler{
4+
out:ArrayType;
5+
6+
constructor(size:number){
7+
this.out = new ArrayType(size);
8+
}
9+
10+
assemble_primitives(vertices:ArrayType, indices:ArrayType, stride:number = 4):ArrayType{
11+
const required_space = indices.length * stride;
12+
if (this.out.length < required_space){
13+
console.warn("Resizing this.out - this generally shouldn't happen");
14+
this.out = new ArrayType(required_space);
15+
}
16+
let out_index = 0;
17+
for(let i = 0; i < indices.length; ++i){
18+
const index = indices[i];
19+
const start = index * stride;
20+
21+
for(let k = 0; k < stride; ++k){
22+
this.out[out_index++] = vertices[start + k];
23+
}
24+
}
25+
return this.out.subarray(0, out_index);
26+
}
27+
}

src/rendering/rasterizer.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { ArrayType, vec4 } from "../math/types";
2+
import { process_perspective, to_viewport_space } from "./vertex";
3+
4+
5+
export function rasterize(vertices:ArrayType, invert_y:boolean = true, stride:number = 4):ArrayType {
6+
const num_verts = vertices.length/stride;
7+
const num_triangles = num_verts/3;
8+
const out = new ArrayType(num_triangles * 6);
9+
let out_index = 0;
10+
for(let i = 0; i < num_triangles; ++i){
11+
const base = 3 * i * stride;
12+
const c1 = vec4(vertices[base + 0], vertices[base + 1], vertices[base + 2], vertices[base + 3]);
13+
const c2 = vec4(vertices[base + stride + 0], vertices[base + stride + 1], vertices[base + stride + 2], vertices[base + stride + 3]);
14+
const c3 = vec4(vertices[base + stride * 2 + 0], vertices[base + stride * 2 + 1], vertices[base + stride * 2 + 2], vertices[base + stride * 2 + 3]);
15+
16+
const n1 = process_perspective(c1);
17+
const n2 = process_perspective(c2);
18+
const n3 = process_perspective(c3);
19+
20+
if(!n1 || !n2 || !n3){
21+
continue;
22+
}
23+
24+
const sign = invert_y? -1 : 1;
25+
26+
out[out_index++] = n1[0];
27+
out[out_index++] = sign * n1[1];
28+
29+
out[out_index++] = n2[0];
30+
out[out_index++] = sign * n2[1];
31+
32+
out[out_index++] = n3[0];
33+
out[out_index++] = sign * n3[1];
34+
}
35+
return out.subarray(0,out_index);
36+
}

src/rendering/render.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { ArrayType } from "../math/types";
2+
3+
4+
export function render(target:HTMLElement, vertices:ArrayType, use_rect:boolean = true, stride:number = 4) {
5+
6+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { ArrayType } from "./math/types";
2+
13
export type vec3 = [number,number,number];
24

35

@@ -61,4 +63,39 @@ export function build_color_text(color_grid:vec3[][], base_text:string){
6163
return html;
6264
}
6365

66+
function get_rect_edge(x1:number, y1:number,x2:number,y2:number,thickness:number) : string{
67+
const dx = x2 - x1;
68+
const dy = y2 - y1;
69+
const len = Math.sqrt(dx * dx + dy * dy);
70+
const ang = Math.atan2(dy, dx) * (180 / Math.PI);
71+
return `<rect x="0" y="${-thickness / 2}" width="${len}" height="${thickness}" transform="translate(${x1} ${y1}) rotate(${ang})"/>`;
72+
}
73+
74+
export function build_3d_svg(vertices:ArrayType, use_rect:boolean, stride:number = 4):string{
75+
const n = vertices.length;
76+
let html = "";
77+
78+
const thickness = 0.005;
79+
80+
81+
for(let i = 0; i < n ; i+=6){
82+
const x1 = vertices[i];
83+
const y1 = vertices[i+1];
84+
85+
const x2 = vertices[i+2];
86+
const y2 = vertices[i+3];
87+
88+
const x3 = vertices[i+4];
89+
const y3 = vertices[i+5];
90+
if(use_rect){
91+
html+= get_rect_edge(x1,y1,x2,y2,thickness);
92+
html+= get_rect_edge(x2,y2,x3,y3,thickness);
93+
html+= get_rect_edge(x3,y3,x1,y1,thickness);
94+
continue;
95+
}
96+
html += `<polygon points = "${x1},${y1} ${x2},${y2} ${x3},${y3}"/>`;
97+
}
98+
return html;
99+
}
100+
64101

src/vertex/primitive_assembler.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)