Skip to content

Commit f6b8e23

Browse files
committed
test(tsfmt): add tabSize test refs #117
1 parent 60f676b commit f6b8e23

File tree

4 files changed

+664
-0
lines changed

4 files changed

+664
-0
lines changed

test/expected/tsfmt/j/main.json

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"baseIndentSize": 0,
3+
"indentSize": 6,
4+
"tabSize": 8,
5+
"indentStyle": 2,
6+
"newLineCharacter": "\r\n",
7+
"convertTabsToSpaces": true,
8+
"insertSpaceAfterCommaDelimiter": true,
9+
"insertSpaceAfterSemicolonInForStatements": true,
10+
"insertSpaceBeforeAndAfterBinaryOperators": true,
11+
"insertSpaceAfterConstructor": false,
12+
"insertSpaceAfterKeywordsInControlFlowStatements": true,
13+
"insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
14+
"insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false,
15+
"insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false,
16+
"insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": true,
17+
"insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": false,
18+
"insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": false,
19+
"insertSpaceAfterTypeAssertion": false,
20+
"insertSpaceBeforeFunctionParenthesis": false,
21+
"placeOpenBraceOnNewLineForFunctions": false,
22+
"placeOpenBraceOnNewLineForControlBlocks": false
23+
}

test/expected/tsfmt/j/main.ts

+318
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
1+
class Vector {
2+
3+
constructor(public x: number, public y: number, public z: number) { }
4+
5+
static times(k: number, v: Vector) {
6+
return new Vector(k * v.x, k * v.y, k * v.z);
7+
}
8+
9+
static minus(v1: Vector, v2: Vector) {
10+
return new Vector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
11+
}
12+
13+
static plus(v1: Vector, v2: Vector) {
14+
return new Vector(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
15+
}
16+
17+
static dot(v1: Vector, v2: Vector) {
18+
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
19+
}
20+
21+
static mag(v: Vector) {
22+
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
23+
}
24+
25+
static norm(v: Vector) {
26+
var mag = Vector.mag(v);
27+
var div = (mag === 0) ? Infinity : 1.0 / mag;
28+
return Vector.times(div, v);
29+
}
30+
31+
static cross(v1: Vector, v2: Vector) {
32+
return new Vector(v1.y * v2.z - v1.z * v2.y,
33+
v1.z * v2.x - v1.x * v2.z,
34+
v1.x * v2.y - v1.y * v2.x);
35+
}
36+
37+
}
38+
39+
class Color {
40+
41+
constructor(public r: number, public g: number, public b: number) { }
42+
43+
static scale(k: number, v: Color) {
44+
return new Color(k * v.r, k * v.g, k * v.b);
45+
}
46+
47+
static plus(v1: Color, v2: Color) {
48+
return new Color(v1.r + v2.r, v1.g + v2.g, v1.b + v2.b);
49+
}
50+
51+
static times(v1: Color, v2: Color) {
52+
return new Color(v1.r * v2.r, v1.g * v2.g, v1.b * v2.b);
53+
}
54+
55+
static white = new Color(1.0, 1.0, 1.0);
56+
static grey = new Color(0.5, 0.5, 0.5);
57+
static black = new Color(0.0, 0.0, 0.0);
58+
static background = Color.black;
59+
static defaultColor = Color.black;
60+
61+
static toDrawingColor(c: Color) {
62+
var legalize = d => d > 1 ? 1 : d;
63+
return {
64+
r: Math.floor(legalize(c.r) * 255),
65+
g: Math.floor(legalize(c.g) * 255),
66+
b: Math.floor(legalize(c.b) * 255)
67+
}
68+
}
69+
70+
}
71+
72+
class Camera {
73+
74+
forward: Vector;
75+
right: Vector;
76+
up: Vector;
77+
78+
constructor(public pos: Vector, lookAt: Vector) {
79+
var down = new Vector(0.0, -1.0, 0.0);
80+
this.forward = Vector.norm(Vector.minus(lookAt, this.pos));
81+
this.right = Vector.times(1.5, Vector.norm(Vector.cross(this.forward, down)));
82+
this.up = Vector.times(1.5, Vector.norm(Vector.cross(this.forward, this.right)));
83+
}
84+
85+
}
86+
87+
interface Ray {
88+
start: Vector;
89+
dir: Vector;
90+
}
91+
92+
interface Intersection {
93+
thing: Thing;
94+
ray: Ray;
95+
dist: number;
96+
}
97+
98+
interface Surface {
99+
diffuse: (pos: Vector) => Color;
100+
specular: (pos: Vector) => Color;
101+
reflect: (pos: Vector) => number;
102+
roughness: number;
103+
}
104+
105+
interface Thing {
106+
intersect: (ray: Ray) => Intersection;
107+
normal: (pos: Vector) => Vector;
108+
surface: Surface;
109+
}
110+
111+
interface Light {
112+
pos: Vector;
113+
color: Color;
114+
}
115+
116+
interface Scene {
117+
things: Thing[];
118+
lights: Light[];
119+
camera: Camera;
120+
}
121+
122+
class Sphere implements Thing {
123+
124+
radius2: number;
125+
126+
constructor(public center: Vector, radius: number, public surface: Surface) {
127+
this.radius2 = radius * radius;
128+
}
129+
130+
normal(pos: Vector): Vector {
131+
return Vector.norm(Vector.minus(pos, this.center));
132+
}
133+
134+
intersect(ray: Ray) {
135+
var eo = Vector.minus(this.center, ray.start);
136+
var v = Vector.dot(eo, ray.dir);
137+
var dist = 0;
138+
if (v >= 0) {
139+
var disc = this.radius2 - (Vector.dot(eo, eo) - v * v);
140+
if (disc >= 0) {
141+
dist = v - Math.sqrt(disc);
142+
}
143+
}
144+
if (dist === 0) {
145+
return null;
146+
} else {
147+
return { thing: this, ray: ray, dist: dist };
148+
}
149+
}
150+
151+
}
152+
153+
class Plane implements Thing {
154+
155+
normal: (pos: Vector) => Vector;
156+
intersect: (ray: Ray) => Intersection;
157+
158+
constructor(norm: Vector, offset: number, public surface: Surface) {
159+
this.normal = function(pos: Vector) { return norm; }
160+
this.intersect = function(ray: Ray): Intersection {
161+
var denom = Vector.dot(norm, ray.dir);
162+
if (denom > 0) {
163+
return null;
164+
} else {
165+
var dist = (Vector.dot(norm, ray.start) + offset) / (-denom);
166+
return { thing: this, ray: ray, dist: dist };
167+
}
168+
}
169+
}
170+
171+
}
172+
173+
module Surfaces {
174+
175+
export var shiny: Surface = {
176+
diffuse: function(pos) { return Color.white; },
177+
specular: function(pos) { return Color.grey; },
178+
reflect: function(pos) { return 0.7; },
179+
roughness: 250
180+
}
181+
182+
export var checkerboard: Surface = {
183+
diffuse: function(pos) {
184+
if ((Math.floor(pos.z) + Math.floor(pos.x)) % 2 !== 0) {
185+
return Color.white;
186+
} else {
187+
return Color.black;
188+
}
189+
},
190+
specular: function(pos) { return Color.white; },
191+
reflect: function(pos) {
192+
if ((Math.floor(pos.z) + Math.floor(pos.x)) % 2 !== 0) {
193+
return 0.1;
194+
} else {
195+
return 0.7;
196+
}
197+
},
198+
roughness: 150
199+
}
200+
201+
}
202+
203+
204+
class RayTracer {
205+
206+
private maxDepth = 5;
207+
208+
private intersections(ray: Ray, scene: Scene) {
209+
var closest = +Infinity;
210+
var closestInter: Intersection = undefined;
211+
for (var i in scene.things) {
212+
var inter = scene.things[i].intersect(ray);
213+
if (inter != null && inter.dist < closest) {
214+
closestInter = inter;
215+
closest = inter.dist;
216+
}
217+
}
218+
return closestInter;
219+
}
220+
221+
private testRay(ray: Ray, scene: Scene) {
222+
var isect = this.intersections(ray, scene);
223+
if (isect != null) {
224+
return isect.dist;
225+
} else {
226+
return undefined;
227+
}
228+
}
229+
230+
private traceRay(ray: Ray, scene: Scene, depth: number): Color {
231+
var isect = this.intersections(ray, scene);
232+
if (isect === undefined) {
233+
return Color.background;
234+
} else {
235+
return this.shade(isect, scene, depth);
236+
}
237+
}
238+
239+
private shade(isect: Intersection, scene: Scene, depth: number) {
240+
var d = isect.ray.dir;
241+
var pos = Vector.plus(Vector.times(isect.dist, d), isect.ray.start);
242+
var normal = isect.thing.normal(pos);
243+
var reflectDir = Vector.minus(d, Vector.times(2, Vector.times(Vector.dot(normal, d), normal)));
244+
var naturalColor = Color.plus(Color.background,
245+
this.getNaturalColor(isect.thing, pos, normal, reflectDir, scene));
246+
var reflectedColor = (depth >= this.maxDepth) ? Color.grey : this.getReflectionColor(isect.thing, pos, normal, reflectDir, scene, depth);
247+
return Color.plus(naturalColor, reflectedColor);
248+
}
249+
250+
private getReflectionColor(thing: Thing, pos: Vector, normal: Vector, rd: Vector, scene: Scene, depth: number) {
251+
return Color.scale(thing.surface.reflect(pos), this.traceRay({ start: pos, dir: rd }, scene, depth + 1));
252+
}
253+
254+
private getNaturalColor(thing: Thing, pos: Vector, norm: Vector, rd: Vector, scene: Scene) {
255+
var addLight = (col, light) => {
256+
var ldis = Vector.minus(light.pos, pos);
257+
var livec = Vector.norm(ldis);
258+
var neatIsect = this.testRay({ start: pos, dir: livec }, scene);
259+
var isInShadow = (neatIsect === undefined) ? false : (neatIsect <= Vector.mag(ldis));
260+
if (isInShadow) {
261+
return col;
262+
} else {
263+
var illum = Vector.dot(livec, norm);
264+
var lcolor = (illum > 0) ? Color.scale(illum, light.color)
265+
: Color.defaultColor;
266+
var specular = Vector.dot(livec, Vector.norm(rd));
267+
var scolor = (specular > 0) ? Color.scale(Math.pow(specular, thing.surface.roughness), light.color)
268+
: Color.defaultColor;
269+
return Color.plus(col, Color.plus(Color.times(thing.surface.diffuse(pos), lcolor),
270+
Color.times(thing.surface.specular(pos), scolor)));
271+
}
272+
}
273+
return scene.lights.reduce(addLight, Color.defaultColor);
274+
}
275+
276+
render(scene, ctx, screenWidth, screenHeight) {
277+
var getPoint = (x, y, camera) => {
278+
var recenterX = x => (x - (screenWidth / 2.0)) / 2.0 / screenWidth;
279+
var recenterY = y => -(y - (screenHeight / 2.0)) / 2.0 / screenHeight;
280+
return Vector.norm(Vector.plus(camera.forward, Vector.plus(Vector.times(recenterX(x), camera.right), Vector.times(recenterY(y), camera.up))));
281+
}
282+
for (var y = 0; y < screenHeight; y++) {
283+
for (var x = 0; x < screenWidth; x++) {
284+
var color = this.traceRay({ start: scene.camera.pos, dir: getPoint(x, y, scene.camera) }, scene, 0);
285+
var c = Color.toDrawingColor(color);
286+
ctx.fillStyle = "rgb(" + String(c.r) + ", " + String(c.g) + ", " + String(c.b) + ")";
287+
ctx.fillRect(x, y, x + 1, y + 1);
288+
}
289+
}
290+
}
291+
292+
}
293+
294+
295+
function defaultScene(): Scene {
296+
return {
297+
things: [new Plane(new Vector(0.0, 1.0, 0.0), 0.0, Surfaces.checkerboard),
298+
new Sphere(new Vector(0.0, 1.0, -0.25), 1.0, Surfaces.shiny),
299+
new Sphere(new Vector(-1.0, 0.5, 1.5), 0.5, Surfaces.shiny)],
300+
lights: [{ pos: new Vector(-2.0, 2.5, 0.0), color: new Color(0.49, 0.07, 0.07) },
301+
{ pos: new Vector(1.5, 2.5, 1.5), color: new Color(0.07, 0.07, 0.49) },
302+
{ pos: new Vector(1.5, 2.5, -1.5), color: new Color(0.07, 0.49, 0.071) },
303+
{ pos: new Vector(0.0, 3.5, 0.0), color: new Color(0.21, 0.21, 0.35) }],
304+
camera: new Camera(new Vector(3.0, 2.0, 4.0), new Vector(-1.0, 0.5, 0.0))
305+
};
306+
}
307+
308+
function exec() {
309+
var canv = document.createElement("canvas");
310+
canv.width = 256;
311+
canv.height = 256;
312+
document.body.appendChild(canv);
313+
var ctx = canv.getContext("2d");
314+
var rayTracer = new RayTracer();
315+
return rayTracer.render(defaultScene(), ctx, 256, 256);
316+
}
317+
318+
exec();

0 commit comments

Comments
 (0)