From aaf4d33405731d9df2c5c989ac70d1e907224d2b Mon Sep 17 00:00:00 2001 From: K-Adam Date: Tue, 27 Oct 2026 18:12:44 +0100 Subject: [PATCH 01/13] Add Group.addMesh and use primitive-geometry in the cube examples --- examples/cube.html | 38 ++++++---------------------- examples/package.json | 1 + package-lock.json | 22 ++++++++++++++++ packages/c3r/README.md | 18 +++++-------- packages/c3r/src/C3R.ts | 8 ++++-- packages/c3r/src/dom/Group.ts | 34 ++++++++++++++++++++++--- packages/c3r/src/dom/Polygon.ts | 7 +++-- packages/c3r/src/math/MeshBuilder.ts | 23 ++++++++++++----- packages/c3r/test/c3r.test.ts | 25 ++++++++++++------ 9 files changed, 113 insertions(+), 63 deletions(-) diff --git a/examples/cube.html b/examples/cube.html index 908d282..ee0406f 100644 --- a/examples/cube.html +++ b/examples/cube.html @@ -15,40 +15,18 @@ diff --git a/packages/c3r-three/README.md b/packages/c3r-three/README.md index fc5087d..c73cd75 100644 --- a/packages/c3r-three/README.md +++ b/packages/c3r-three/README.md @@ -22,7 +22,7 @@ renderer.render(scene, camera); `CSS3DObject` and `CSS3DSprite` are re-exported from `three/addons`, so their elements receive pointer events as with three's renderer. -Perspective and orthographic cameras are supported, including `zoom`. Material `color`, `map` (image or canvas, with `repeat` and `offset`), `opacity` and map alpha (when `transparent`) and `side` (`BackSide` shows both sides) are applied, and a material's style is removed on its `dispose()`. `renderer.dispose()` removes every rendered scene. +Perspective and orthographic cameras are supported, including `zoom`. Material `color`, `map` (image or canvas, with `repeat` and `offset`, its alpha always), `opacity` (when `transparent`) and `side` (`BackSide` shows both sides) are applied, and a material's style is removed on its `dispose()`. `renderer.dispose()` removes every rendered scene. Not supported yet: `ImageBitmap` maps such as GLTFLoader's, `flipY: false`, and map `rotation` and `center`. diff --git a/packages/c3r-three/src/C3RRenderer.ts b/packages/c3r-three/src/C3RRenderer.ts index 91487e8..fbed2f2 100644 --- a/packages/c3r-three/src/C3RRenderer.ts +++ b/packages/c3r-three/src/C3RRenderer.ts @@ -111,7 +111,7 @@ export class C3RRenderer { this.#syncCamera(container, camera); this.#syncObject(scene, container.root, container); - container.fitUnitScale(); + container.bake(); } #syncCamera(container: C3R.Container, camera: Camera): void { @@ -352,15 +352,19 @@ export class C3RRenderer { } target.backgroundImageSrc = src; - if (material.color) { + // White multiplies to the map unchanged, and needs no mask + if (material.color && (!src || material.color.getHex() !== 0xffffff)) { material.color.getRGB(_rgb, SRGBColorSpace); target.backgroundColor = [_rgb.r, _rgb.g, _rgb.b, 1]; } else { target.backgroundColor = null; } - target.opacity = material.transparent ? material.opacity : 1; - target.transparent = material.transparent; + // Unclamped in three.js + target.filter = + material.transparent && material.opacity < 1 + ? C3R.Filter.opacity(Math.max(0, material.opacity)) + : null; target.doubleSided = material.side !== FrontSide; return map; diff --git a/packages/c3r-three/test/C3RRenderer.test.ts b/packages/c3r-three/test/C3RRenderer.test.ts index b6a2178..6458e12 100644 --- a/packages/c3r-three/test/C3RRenderer.test.ts +++ b/packages/c3r-three/test/C3RRenderer.test.ts @@ -11,11 +11,19 @@ import { Scene, Sprite, SpriteMaterial, + Texture, Vector3, } from "three"; import { cssText } from "c3r"; import { C3RRenderer, CSS3DObject } from "../src/C3RRenderer.js"; +const materialRule = (element: Element) => { + const name = /c3r-material-\d+/.exec(element.className)![0]; + return cssText() + .split("\n") + .find((r) => r.startsWith(`.${name} `))!; +}; + const setup = () => { const renderer = new C3RRenderer(); renderer.setSize(800, 600); @@ -30,7 +38,7 @@ const setup = () => { const cssMatrix = (element: Element) => { const match = /matrix3d\(([^)]*)\)/.exec( - (element as HTMLElement).style.transform, + (element as HTMLElement).style.getPropertyValue("--c3r-matrix"), ); return mat4.clone(match![1].split(",").map(Number) as unknown as mat4); }; @@ -167,19 +175,52 @@ it("applies the camera zoom", () => { expect(cssText()).toMatch(/--c3r-camera-fov: ?53\.13/); }); -it("ignores opacity and map alpha unless the material is transparent, as WebGL", () => { +it("leaves white untinted, so a map needs no mask", () => { + const { renderer, scene, camera, root } = setup(); + const rule = () => + materialRule(root().querySelector("[class*=c3r-material-]")!); + + const image = document.createElement("img"); + image.src = "crate.png"; + const material = new MeshBasicMaterial({ map: new Texture(image) }); + scene.add(new Mesh(new BoxGeometry(), material)); + renderer.render(scene, camera); + expect(rule()).toMatch(/--c3r-background-color: ?transparent/); + expect(rule()).toContain("--c3r-mask-image: none"); + + material.color.set(0xff0000); + renderer.render(scene, camera); + expect(rule()).toMatch(/--c3r-background-color: ?rgba\(255, ?0, ?0/); + expect(rule()).toMatch(/--c3r-mask-image: ?var\(--c3r-background-image/); + material.dispose(); +}); + +it("paints a white sprite without a map", () => { + const { renderer, scene, camera, root } = setup(); + const material = new SpriteMaterial(); + scene.add(new Sprite(material)); + renderer.render(scene, camera); + + const rule = materialRule(root().querySelector("[class*=c3r-material-]")!); + expect(rule).toMatch(/--c3r-background-color: ?rgba\(255, ?255, ?255/); + material.dispose(); +}); + +it("ignores opacity unless the material is transparent, as WebGL", () => { const { renderer, scene, camera } = setup(); const material = new MeshBasicMaterial({ opacity: 0.5 }); scene.add(new Mesh(new BoxGeometry(), material)); renderer.render(scene, camera); - expect(cssText()).not.toMatch(/--c3r-opacity:/); - expect(cssText()).not.toMatch(/--c3r-mask-image:/); + expect(cssText()).not.toMatch(/--c3r-filter:/); material.transparent = true; renderer.render(scene, camera); - expect(cssText()).toMatch(/--c3r-opacity: ?0\.5/); - expect(cssText()).toMatch(/--c3r-mask-image: ?var\(--c3r-background-image/); + expect(cssText()).toMatch(/--c3r-filter: ?opacity\(0\.5\)/); + + material.opacity = -0.1; + renderer.render(scene, camera); + expect(cssText()).toMatch(/--c3r-filter: ?opacity\(0\)/); material.dispose(); }); @@ -233,14 +274,9 @@ it("shows back faces unless the material is FrontSide", () => { scene.add(new Mesh(new BoxGeometry(), double)); renderer.render(scene, camera); - const [frontRule, doubleRule] = [...root().children].map((mesh) => { - const className = /c3r-material-\d+/.exec( - mesh.firstElementChild!.className, - )![0]; - return cssText() - .split("\n") - .find((r) => r.startsWith(`.${className} `))!; - }); + const [frontRule, doubleRule] = [...root().children].map((mesh) => + materialRule(mesh.firstElementChild!), + ); expect(frontRule).not.toContain("backface-visibility"); expect(doubleRule).toMatch(/backface-visibility: ?visible/); diff --git a/packages/c3r/README.md b/packages/c3r/README.md index f19a799..ff38b81 100644 --- a/packages/c3r/README.md +++ b/packages/c3r/README.md @@ -44,20 +44,24 @@ box.material.backgroundImageSrc = "crate.jpg"; container.camera.matrix = mat4.fromTranslation(mat4.create(), [0, 0, -400]); ``` -| Class | What it is | -| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `toHTML()` | -| `Group` | A transformed node: `matrix`, `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | -| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset` | -| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | -| `Material` | `backgroundColor`, `backgroundImageSrc`, `opacity`, `transparent`, `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | -| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (inverse world) and `fov`, or `left`, `right`, `top`, `bottom` | +| Class | What it is | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `unitScale`, `bake()` fits it, `toHTML()` | +| `Group` | A transformed node: `matrix`, `tween` (one or an array), `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | +| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset` | +| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | +| `Tween` | A CSS animation of a group: `keyframes` of `Transform` and `Filter` steps, `duration`, `delay`, `easing`, `loop`, `alternate`, `paused`, `hover` | +| `Transform`, `Filter` | Steps from factories: `translate` (scene units), `rotateX`, `rotateY`, `rotateZ`, `scale`; `opacity`, `brightness`, `contrast`, `saturate`, `grayscale`, `sepia`, `invert`, `hueRotate`, `blur` (px of each polygon's element) | +| `Material` | `backgroundColor`, `backgroundImageSrc`, `filter` (one or an array of `Filter` steps, before a tween's), `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | +| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (inverse world) and `fov`, or `left`, `right`, `top`, `bottom` | -A `transparent` material's image alpha also cuts out its color. Every property applies on assignment; there is no `update()` to call. A polygon is laid out from its vertices on construction, so put it in a group to move it. +An image's alpha shows through, also when a color tints it; a material with only an image drops an inherited tint. Every property applies on assignment; there is no `update()` to call. A polygon is laid out from its vertices on construction, so put it in a group to move it. -A `Material` or camera is a class rule in one shared stylesheet, so the objects using it share one style. The rule stays until `[Symbol.dispose]()` is called, or the owner leaves a `using` block; otherwise it is removed once the owner and its elements are garbage-collected. +A `Material`, `Tween` or camera is a class rule in one shared stylesheet, so the objects using it share one style. The rule stays until `[Symbol.dispose]()` is called, or the owner leaves a `using` block; otherwise it is removed once the owner and its elements are garbage-collected. -On a live page, call `container.fitUnitScale()` after building or heavily scaling the scene; `toHTML()` calls it for you. +A tween animates a group after its `matrix`, from rest, and a group's tweens apply in array order. Its keyframes play in sequence, `duration` seconds each unless written as `{ steps, duration }`, and `easing` applies to each; a keyframe is one step or an array of steps, and what it doesn't list holds. Transforms apply in the order they first appear. Angles are radians and may exceed a half turn. `Filter` steps apply to the polygons and `ElementObject` elements, and a nested group's filters replace its parent's. With `hover`, a `loop` plays only while hovered; any other tween takes one keyframe and eases to it and back. Setting `paused` later pauses every group using the tween; a hover transition can't pause, so it stops responding to hover instead. It runs on the main thread and `bake()` ignores its scale. Use a negative `delay`, in seconds, to offset the phase. + +On a live page, call `container.bake()` after building or heavily scaling the scene; `toHTML()` calls it for you. An orthographic camera needs `setSize()`: without it the container takes the window size at construction and does not follow resizes. @@ -65,7 +69,7 @@ The stylesheet is adopted by `document` only, so a container inside a shadow roo ## Node -C3R builds plain DOM elements, so it runs on a server-side DOM like [happy-dom](https://github.com/capricorn86/happy-dom). Stylesheets are not serialized, so export with `toHTML()`: the container markup after a `${this.domElement.outerHTML}`; + this.bake(); + // So no value can close the style element + const css = cssText().replaceAll("<", "\\3c "); + return `${this.domElement.outerHTML}`; } setSize(width: number, height: number): void { diff --git a/packages/c3r/src/dom/Group.ts b/packages/c3r/src/dom/Group.ts index feef617..2b79c7d 100644 --- a/packages/c3r/src/dom/Group.ts +++ b/packages/c3r/src/dom/Group.ts @@ -1,5 +1,6 @@ import type { ReadonlyMat4 } from "gl-matrix"; +import { type Tween, tweenStyle } from "../css/Tween.js"; import { MeshBuilder, type MeshFace, @@ -12,6 +13,9 @@ import { Polygon, type PolygonOptions } from "./Polygon.js"; const parents = new WeakMap(); +// Keeps the tweens, and their rules, alive while their element is +const elementTweens = new WeakMap(); + export interface IndexedMesh { positions: ArrayLike; uvs: ArrayLike; @@ -20,6 +24,7 @@ export interface IndexedMesh { export class Group extends Object3D { readonly #children: Object3D[] = []; + #tween: Tween | readonly Tween[] | null = null; constructor() { super(); @@ -35,6 +40,25 @@ export class Group extends Object3D { this.setMatrix(matrix); } + get tween(): Tween | readonly Tween[] | null { + return this.#tween; + } + + set tween(tween: Tween | readonly Tween[] | null) { + const { classList, style } = this.domElement; + const tweens = [...new Set([tween ?? []].flat())]; + const properties = tweenStyle(tweens); + for (const old of elementTweens.get(this.domElement) ?? []) + classList.remove(old.className); + for (const { className } of tweens) classList.add(className); + for (const [name, value] of Object.entries(properties)) { + if (value) style.setProperty(name, value); + else style.removeProperty(name); + } + elementTweens.set(this.domElement, tweens); + this.#tween = Array.isArray(tween) ? Object.freeze(tweens) : tween; + } + get children(): readonly Object3D[] { return this.#children; } diff --git a/packages/c3r/src/dom/Object3D.ts b/packages/c3r/src/dom/Object3D.ts index f16ffd0..57888d1 100644 --- a/packages/c3r/src/dom/Object3D.ts +++ b/packages/c3r/src/dom/Object3D.ts @@ -22,7 +22,10 @@ export abstract class Object3D { protected setMatrix(matrix: ReadonlyMat4): void { if (mat4.exactEquals(matrix, this.#matrix)) return; mat4.copy(this.#matrix, matrix); - this.domElement.style.transform = `matrix3d(${[...matrix].join()})`; + this.domElement.style.setProperty( + "--c3r-matrix", + `matrix3d(${[...matrix].join()})`, + ); } get material(): Material | null { diff --git a/packages/c3r/test/c3r.test.ts b/packages/c3r/test/c3r.test.ts index 6c738c5..1f9f7f5 100644 --- a/packages/c3r/test/c3r.test.ts +++ b/packages/c3r/test/c3r.test.ts @@ -4,12 +4,15 @@ import { Container, cssText, ElementObject, + Filter, Group, Material, MeshBuilder, OrthographicCamera, PerspectiveCamera, Polygon, + Transform, + Tween, type Vertex, } from "c3r"; @@ -507,6 +510,10 @@ describe("ElementObject", () => { }); }); +// A class rule's declarations, or "" once it is gone +const ruleOf = (className: string) => + new RegExp(String.raw`\.${className} \{[^}]*`).exec(cssText())?.[0] ?? ""; + describe("Material", () => { it("styles objects through a class rule, removed on dispose", () => { const group = new Group(); @@ -519,11 +526,7 @@ describe("Material", () => { expect( group.domElement.style.getPropertyValue("--c3r-background-color"), ).toBe(""); - expect(cssText()).toMatch( - new RegExp( - `\\.${material.className} \\{[^}]*rgba\\(255, ?0, ?0, ?1\\)`, - ), - ); + expect(ruleOf(material.className)).toMatch(/rgba\(255, ?0, ?0, ?1\)/); using other = new Material(); group.material = other; @@ -534,15 +537,12 @@ describe("Material", () => { group.material = material; } - expect(cssText()).not.toContain(`.${group.material.className} `); + expect(ruleOf(group.material.className)).toBe(""); }); it("shows back faces when double-sided", () => { using material = new Material(); - const rule = () => - cssText() - .split("\n") - .find((r) => r.startsWith(`.${material.className} `)); + const rule = () => ruleOf(material.className); material.doubleSided = true; expect(rule()).toMatch(/backface-visibility: ?visible/); @@ -550,11 +550,284 @@ describe("Material", () => { material.doubleSided = false; expect(rule()).not.toContain("backface-visibility"); }); + + it("masks a tint to the image in effect", () => { + using material = new Material(); + const vars = () => + ["--c3r-background-color", "--c3r-mask-image"].map( + (name) => + new RegExp(`${name}: ?([^;]+)`).exec( + ruleOf(material.className), + )?.[1] ?? null, + ); + + expect(vars()).toEqual([null, null]); + material.backgroundImageSrc = "leaf.png"; + expect(vars()).toEqual(["transparent", "none"]); + material.backgroundColor = [1, 0, 0, 1]; + expect(vars()[0]).toMatch(/rgba\(255, ?0, ?0, ?1\)/); + expect(vars()[1]).toBe("var(--c3r-background-image, none)"); + material.backgroundImageSrc = null; + expect(vars()[1]).toBe("var(--c3r-background-image, none)"); + material.backgroundColor = null; + expect(vars()).toEqual([null, null]); + }); + + it("filters with Filter steps only", () => { + using material = new Material(); + const rule = () => ruleOf(material.className); + + const filter = [Filter.grayscale(1), Filter.brightness(1.2)]; + material.filter = filter; + expect(material.filter).toEqual(filter); + expect(rule()).toContain("--c3r-filter: grayscale(1) brightness(1.2)"); + + material.filter = null; + expect(rule()).not.toContain("--c3r-filter"); + expect(() => (material.filter = Transform.scale(2) as never)).toThrow( + TypeError, + ); + }); +}); + +describe("Tween", () => { + const turn = 2 * Math.PI; + + it("animates groups through class rules, removed on dispose", () => { + const group = new Group(); + group.matrix = mat4.fromTranslation(mat4.create(), [1, 2, 3]); + expect(group.domElement.style.getPropertyValue("--c3r-matrix")).toBe( + "matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,1,2,3,1)", + ); + + let className; + { + using spin = new Tween({ + keyframes: [ + [ + Transform.rotateX(turn), + Transform.rotateZ(turn), + Transform.translate([0, 20, 0]), + ], + ], + duration: 2, + loop: true, + }); + className = spin.className; + const track = `--${className}`; + group.tween = spin; + + expect(group.domElement.classList).toContain(className); + expect(cssText()).toContain( + `@property ${track} { syntax: ""; inherits: false; initial-value: translate(0); }`, + ); + expect(cssText()).toContain( + `${track}: rotateX(0rad) rotateZ(0rad) translate3d(0px,0px,0px)`, + ); + expect(cssText()).toContain( + `${track}: rotateX(${turn}rad) rotateZ(${turn}rad) translate3d(0px,20px,0px)`, + ); + expect(ruleOf(spin.className)).toContain( + `${track}-animation: ${className} 2s linear 0s infinite normal both var(${track}-state)`, + ); + const { style } = group.domElement; + expect(style.getPropertyValue("--c3r-tween-transform")).toBe( + `var(${track},)`, + ); + expect(style.animation).toBe(`var(${track}-animation, none)`); + + spin.paused = true; + expect(ruleOf(spin.className)).toMatch(`${track}-state: paused`); + + using other = new Tween({ keyframes: [Transform.scale(0.5)] }); + expect(cssText()).toContain("scale3d(0.5,0.5,0.5)"); + group.tween = other; + expect([...group.domElement.classList]).toEqual([ + "c3r-group", + other.className, + ]); + } + expect(cssText()).not.toContain(`${className} `); + }); + + it("composes several tweens on one group", () => { + const group = new Group(); + using spin = new Tween({ + keyframes: [Transform.rotateY(turn)], + loop: true, + }); + using fade = new Tween({ keyframes: [Filter.opacity(0.5)], hover: true }); + using tint = new Tween({ keyframes: [Filter.sepia(1)] }); + const tweens = [spin, fade, tint]; + group.tween = tweens; + expect(group.tween).toEqual(tweens); + + const { classList, style } = group.domElement; + expect([...classList]).toEqual([ + "c3r-group", + ...tweens.map((t) => t.className), + ]); + expect(style.getPropertyValue("--c3r-tween-transform")).toBe( + `var(--${spin.className},)`, + ); + expect(style.animation).toBe( + `var(--${spin.className}-animation, none), var(--${tint.className}-animation, none)`, + ); + expect(style.transition).toBe( + `var(--${fade.className}-transition, --${fade.className} 0s)`, + ); + expect(style.getPropertyValue("--c3r-tween-filter")).toBe( + `opacity(var(--${fade.className}-opacity, 1)) sepia(var(--${tint.className}-sepia, 0))`, + ); + + tweens.pop(); + group.tween = tweens; + expect(classList).not.toContain(tint.className); + group.tween = [spin, spin]; + expect(style.animation).toBe(`var(--${spin.className}-animation, none)`); + + group.tween = null; + expect([...classList]).toEqual(["c3r-group"]); + expect(style.cssText).toBe(""); + }); + + it("plays keyframes in sequence, holding what they don't list", () => { + using sequence = new Tween({ + keyframes: [ + Transform.translate([0, 50, 0]), + { steps: Transform.rotateY(turn), duration: 2 }, + [], + Filter.opacity(0), + ], + }); + const track = `--${sequence.className}`; + const stop = (offset: number, y: number, angle: number, opacity: number) => + `${offset}% { ${track}: translate3d(0px,${y}px,0px) rotateY(${angle}rad); ${track}-opacity: ${opacity}; }`; + for (const block of [ + stop(0, 0, 0, 1), + stop(20, 50, 0, 1), + stop(60, 50, turn, 1), + stop(80, 50, turn, 1), + stop(100, 50, turn, 0), + ]) + expect(cssText()).toContain(block); + expect(ruleOf(sequence.className)).toContain(`${sequence.className} 5s`); + }); + + it("plays a loop on hover only, removed on dispose", () => { + let selector; + { + using pulse = new Tween({ + keyframes: [Transform.scale(2)], + loop: true, + hover: true, + }); + selector = `.${pulse.className}:not(:hover)`; + expect(ruleOf(pulse.className)).toMatch(/pointer-events: ?auto/); + expect(cssText()).toContain( + `${selector} { --${pulse.className}-state: paused; }`, + ); + } + expect(cssText()).not.toContain(selector); + }); + + it("transitions to its end while hovered, disabled when paused", () => { + let className; + { + using fade = new Tween({ + keyframes: [Filter.opacity(0.5)], + duration: 2, + hover: true, + }); + className = fade.className; + const opacity = `--${className}-opacity`; + expect(cssText()).not.toContain(`@keyframes ${className}`); + const rule = ruleOf(fade.className); + expect(rule).toContain(`${opacity}: 1`); + expect(rule).toContain( + `--${className}-transition: ${opacity} 2s linear 0s`, + ); + expect(rule).toMatch(/pointer-events: ?auto/); + expect(rule).not.toContain("animation"); + + const hovered = `.${className}:hover { ${opacity}: 0.5; }`; + expect(cssText()).toContain(hovered); + fade.paused = true; + expect(cssText()).not.toContain(hovered); + fade.paused = false; + expect(cssText()).toContain(hovered); + } + expect(cssText()).not.toContain(className); + }); + + it("rejects invalid steps and timing", () => { + expect(() => new Tween({ keyframes: [] })).toThrow(RangeError); + expect(() => new Tween({ keyframes: [[]] })).toThrow(RangeError); + expect(() => new Tween({ keyframes: [{} as Transform] })).toThrow( + TypeError, + ); + expect(() => Transform.translate([0, NaN, 0])).toThrow(RangeError); + expect(() => Transform.scale([1, 1] as never)).toThrow(RangeError); + expect(() => Transform.rotateY(Infinity)).toThrow(RangeError); + expect(() => Filter.brightness(-1)).toThrow(RangeError); + expect(() => Filter.blur(NaN)).toThrow(RangeError); + expect( + () => new Tween({ keyframes: [[Filter.sepia(1), Filter.sepia(0.5)]] }), + ).toThrow(RangeError); + const scale = Transform.scale(2); + expect( + () => new Tween({ keyframes: [{ steps: scale, duration: 0 }] }), + ).toThrow(RangeError); + expect(() => new Tween({ keyframes: [scale, scale], hover: true })).toThrow( + RangeError, + ); + for (const timing of [ + { duration: NaN }, + { duration: -1 }, + { easing: "ease-in, ease-out" }, + { easing: " inherit " }, + { easing: "var(--ease)" }, + { easing: "ease; } body { display: none } .x {" }, + { easing: "steps(2" }, + { easing: "ease)(" }, + { delay: NaN }, + { alternate: true }, + ]) + expect(() => new Tween({ keyframes: [scale], ...timing })).toThrow( + RangeError, + ); + const easing = "cubic-bezier(0.2, 0, 0.4, 1)"; + new Tween({ keyframes: [scale], easing })[Symbol.dispose](); + }); + + it("chains filters in order, each through its own property", () => { + using look = new Tween({ + keyframes: [ + [Filter.brightness(2), Filter.hueRotate(turn), Filter.blur(3)], + ], + }); + const p = `--${look.className}`; + expect(cssText()).toContain( + `0% { ${p}-brightness: 1; ${p}-hue-rotate: 0rad; ${p}-blur: 0px; }`, + ); + expect(cssText()).toContain( + `100% { ${p}-brightness: 2; ${p}-hue-rotate: ${turn}rad; ${p}-blur: 3px; }`, + ); + expect(cssText()).toContain( + `@property ${p}-hue-rotate { syntax: ""; inherits: false; initial-value: 0rad; }`, + ); + const group = new Group(); + group.tween = look; + expect(group.domElement.style.getPropertyValue("--c3r-tween-filter")).toBe( + `brightness(var(${p}-brightness, 1)) hue-rotate(var(${p}-hue-rotate, 0rad)) blur(var(${p}-blur, 0px))`, + ); + }); }); describe("server-side rendering", () => { it("exports the stylesheet for static html", () => { expect(cssText()).toContain(".c3r-polygon"); + expect(cssText()).toContain("@property --c3r-matrix"); }); it("exports the scene as static html", () => { @@ -567,10 +840,25 @@ describe("server-side rendering", () => { const html = container.toHTML(); const { outerHTML } = container.domElement; - expect(html).toBe(`${outerHTML}`); + const css = cssText().replaceAll("<", "\\3c "); + expect(html).toBe(`${outerHTML}`); expect(outerHTML).toContain("--c3r-unit-scale"); }); + it("keeps every value inside the exported style element", () => { + const container = new Container(); + const group = new Group(); + group.material = new Material(); + group.material.backgroundImageSrc = "a"; + container.root.addChild(group); + + expect(container.toHTML()).not.toContain(" diff --git a/examples/three_geometry_cube.html b/examples/three_geometry_cube.html index 406caa1..a87b127 100644 --- a/examples/three_geometry_cube.html +++ b/examples/three_geometry_cube.html @@ -6,49 +6,51 @@ c3r - Cube geometry +
+ three.js + - cube geometry. Drag to spin the cube. +
+ diff --git a/examples/three_geometry_earth.html b/examples/three_geometry_earth.html index 406faf4..b9e0827 100644 --- a/examples/three_geometry_earth.html +++ b/examples/three_geometry_earth.html @@ -6,22 +6,22 @@ c3r - Earth -
three.js - - earth demo + - earth. Move the pointer to orbit.
diff --git a/examples/three_interactive_cubes_tween.html b/examples/three_interactive_cubes_tween.html index ec74ae4..dfd9ea2 100644 --- a/examples/three_interactive_cubes_tween.html +++ b/examples/three_interactive_cubes_tween.html @@ -6,25 +6,40 @@ c3r - Interactive cubes +
+ three.js + - interactive cubes. Click a cube to move it. +
+ diff --git a/examples/three_loader_obj.html b/examples/three_loader_obj.html index d7c9dc0..3664264 100644 --- a/examples/three_loader_obj.html +++ b/examples/three_loader_obj.html @@ -6,45 +6,42 @@ c3r - OBJ loader -
three.js - - OBJLoader test + - OBJ loader. Move the pointer to orbit.
diff --git a/examples/three_materials_texture_canvas.html b/examples/three_materials_texture_canvas.html index 3a2c35a..9000a8f 100644 --- a/examples/three_materials_texture_canvas.html +++ b/examples/three_materials_texture_canvas.html @@ -6,26 +6,25 @@ c3r - Canvas material
- three.js css3d - - sprites. + three.js + - css3d sprites. Drag to rotate, scroll to zoom.
-
diff --git a/examples/three_sprites2.html b/examples/three_sprites2.html index b70f18d..dfa9d2d 100644 --- a/examples/three_sprites2.html +++ b/examples/three_sprites2.html @@ -6,21 +6,40 @@ c3r - Sprites 2 - +
+ three.js + - sprites. +
+ From f2d4a871a69a9e051539131cc02be976991b40a5 Mon Sep 17 00:00:00 2001 From: K-Adam Date: Wed, 28 Oct 2026 20:52:46 +0100 Subject: [PATCH 08/13] Simplify Suzanne in the OBJ example --- .../public/models/obj/suzanne/suzanne.obj | 3237 ++++++----------- 1 file changed, 1076 insertions(+), 2161 deletions(-) diff --git a/examples/public/models/obj/suzanne/suzanne.obj b/examples/public/models/obj/suzanne/suzanne.obj index 6043774..4a29814 100644 --- a/examples/public/models/obj/suzanne/suzanne.obj +++ b/examples/public/models/obj/suzanne/suzanne.obj @@ -1,550 +1,364 @@ -# Blender3D v249 OBJ File: suzanne.blend -# www.blender3d.org -v 0.437500 0.164063 0.765625 -v -0.437500 0.164063 0.765625 -v 0.500000 0.093750 0.687500 -v -0.500000 0.093750 0.687500 -v 0.546875 0.054688 0.578125 -v -0.546875 0.054688 0.578125 -v 0.351563 -0.023438 0.617188 -v -0.351563 -0.023438 0.617188 -v 0.351563 0.031250 0.718750 -v -0.351563 0.031250 0.718750 -v 0.351563 0.132813 0.781250 -v -0.351563 0.132813 0.781250 -v 0.273438 0.164063 0.796875 -v -0.273438 0.164063 0.796875 -v 0.203125 0.093750 0.742188 -v -0.203125 0.093750 0.742188 -v 0.156250 0.054688 0.648438 -v -0.156250 0.054688 0.648438 -v 0.078125 0.242188 0.656250 -v -0.078125 0.242188 0.656250 -v 0.140625 0.242188 0.742188 -v -0.140625 0.242188 0.742188 -v 0.242188 0.242188 0.796875 -v -0.242188 0.242188 0.796875 -v 0.273438 0.328125 0.796875 -v -0.273438 0.328125 0.796875 -v 0.203125 0.390625 0.742188 -v -0.203125 0.390625 0.742188 -v 0.156250 0.437500 0.648438 -v -0.156250 0.437500 0.648438 -v 0.351563 0.515625 0.617188 -v -0.351563 0.515625 0.617188 -v 0.351563 0.453125 0.718750 -v -0.351563 0.453125 0.718750 -v 0.351563 0.359375 0.781250 -v -0.351563 0.359375 0.781250 -v 0.437500 0.328125 0.765625 -v -0.437500 0.328125 0.765625 -v 0.500000 0.390625 0.687500 -v -0.500000 0.390625 0.687500 -v 0.546875 0.437500 0.578125 -v -0.546875 0.437500 0.578125 -v 0.625000 0.242188 0.562500 -v -0.625000 0.242188 0.562500 -v 0.562500 0.242188 0.671875 -v -0.562500 0.242188 0.671875 -v 0.468750 0.242188 0.757813 -v -0.468750 0.242188 0.757813 -v 0.476563 0.242188 0.773438 -v -0.476563 0.242188 0.773438 -v 0.445313 0.335938 0.781250 -v -0.445313 0.335938 0.781250 -v 0.351563 0.375000 0.804688 -v -0.351563 0.375000 0.804688 -v 0.265625 0.335938 0.820313 -v -0.265625 0.335938 0.820313 -v 0.226563 0.242188 0.820313 -v -0.226563 0.242188 0.820313 -v 0.265625 0.156250 0.820313 -v -0.265625 0.156250 0.820313 -v 0.351563 0.242188 0.828125 -v -0.351563 0.242188 0.828125 -v 0.351563 0.117188 0.804688 -v -0.351563 0.117188 0.804688 -v 0.445313 0.156250 0.781250 -v -0.445313 0.156250 0.781250 -v 0.000000 0.429688 0.742188 -v 0.000000 0.351563 0.820313 -v 0.000000 -0.679688 0.734375 -v 0.000000 -0.320313 0.781250 -v 0.000000 -0.187500 0.796875 -v 0.000000 -0.773438 0.718750 -v 0.000000 0.406250 0.601563 -v 0.000000 0.570313 0.570313 -v 0.000000 0.898438 -0.546875 -v 0.000000 0.562500 -0.851563 -v 0.000000 0.070313 -0.828125 -v 0.000000 -0.382813 -0.351563 -v 0.203125 -0.187500 0.562500 -v -0.203125 -0.187500 0.562500 -v 0.312500 -0.437500 0.570313 -v -0.312500 -0.437500 0.570313 -v 0.351563 -0.695313 0.570313 -v -0.351563 -0.695313 0.570313 -v 0.367188 -0.890625 0.531250 -v -0.367188 -0.890625 0.531250 -v 0.328125 -0.945313 0.523438 -v -0.328125 -0.945313 0.523438 -v 0.179688 -0.968750 0.554688 -v -0.179688 -0.968750 0.554688 -v 0.000000 -0.984375 0.578125 -v 0.437500 -0.140625 0.531250 -v -0.437500 -0.140625 0.531250 -v 0.632813 -0.039063 0.539063 -v -0.632813 -0.039063 0.539063 -v 0.828125 0.148438 0.445313 -v -0.828125 0.148438 0.445313 -v 0.859375 0.429688 0.593750 -v -0.859375 0.429688 0.593750 -v 0.710938 0.484375 0.625000 -v -0.710938 0.484375 0.625000 -v 0.492188 0.601563 0.687500 -v -0.492188 0.601563 0.687500 -v 0.320313 0.757813 0.734375 -v -0.320313 0.757813 0.734375 -v 0.156250 0.718750 0.757813 -v -0.156250 0.718750 0.757813 -v 0.062500 0.492188 0.750000 -v -0.062500 0.492188 0.750000 -v 0.164063 0.414063 0.773438 -v -0.164063 0.414063 0.773438 -v 0.125000 0.304688 0.765625 -v -0.125000 0.304688 0.765625 -v 0.203125 0.093750 0.742188 -v -0.203125 0.093750 0.742188 -v 0.375000 0.015625 0.703125 -v -0.375000 0.015625 0.703125 -v 0.492188 0.062500 0.671875 -v -0.492188 0.062500 0.671875 -v 0.625000 0.187500 0.648438 -v -0.625000 0.187500 0.648438 -v 0.640625 0.296875 0.648438 -v -0.640625 0.296875 0.648438 -v 0.601563 0.375000 0.664063 -v -0.601563 0.375000 0.664063 -v 0.429688 0.437500 0.718750 -v -0.429688 0.437500 0.718750 -v 0.250000 0.468750 0.757813 -v -0.250000 0.468750 0.757813 -v 0.000000 -0.765625 0.734375 -v 0.109375 -0.718750 0.734375 -v -0.109375 -0.718750 0.734375 -v 0.117188 -0.835938 0.710938 -v -0.117188 -0.835938 0.710938 -v 0.062500 -0.882813 0.695313 -v -0.062500 -0.882813 0.695313 -v 0.000000 -0.890625 0.687500 -v 0.000000 -0.195313 0.750000 -v 0.000000 -0.140625 0.742188 -v 0.101563 -0.148438 0.742188 -v -0.101563 -0.148438 0.742188 -v 0.125000 -0.226563 0.750000 -v -0.125000 -0.226563 0.750000 -v 0.085938 -0.289063 0.742188 -v -0.085938 -0.289063 0.742188 -v 0.398438 -0.046875 0.671875 -v -0.398438 -0.046875 0.671875 -v 0.617188 0.054688 0.625000 -v -0.617188 0.054688 0.625000 -v 0.726563 0.203125 0.601563 -v -0.726563 0.203125 0.601563 -v 0.742188 0.375000 0.656250 -v -0.742188 0.375000 0.656250 -v 0.687500 0.414063 0.726563 -v -0.687500 0.414063 0.726563 -v 0.437500 0.546875 0.796875 -v -0.437500 0.546875 0.796875 -v 0.312500 0.640625 0.835938 -v -0.312500 0.640625 0.835938 -v 0.203125 0.617188 0.851563 -v -0.203125 0.617188 0.851563 -v 0.101563 0.429688 0.843750 -v -0.101563 0.429688 0.843750 -v 0.125000 -0.101563 0.812500 -v -0.125000 -0.101563 0.812500 -v 0.210938 -0.445313 0.710938 -v -0.210938 -0.445313 0.710938 -v 0.250000 -0.703125 0.687500 -v -0.250000 -0.703125 0.687500 -v 0.265625 -0.820313 0.664063 -v -0.265625 -0.820313 0.664063 -v 0.234375 -0.914063 0.632813 -v -0.234375 -0.914063 0.632813 -v 0.164063 -0.929688 0.632813 -v -0.164063 -0.929688 0.632813 -v 0.000000 -0.945313 0.640625 -v 0.000000 0.046875 0.726563 -v 0.000000 0.210938 0.765625 -v 0.328125 0.476563 0.742188 -v -0.328125 0.476563 0.742188 -v 0.164063 0.140625 0.750000 -v -0.164063 0.140625 0.750000 -v 0.132813 0.210938 0.757813 -v -0.132813 0.210938 0.757813 -v 0.117188 -0.687500 0.734375 -v -0.117188 -0.687500 0.734375 -v 0.078125 -0.445313 0.750000 -v -0.078125 -0.445313 0.750000 -v 0.000000 -0.445313 0.750000 -v 0.000000 -0.328125 0.742188 -v 0.093750 -0.273438 0.781250 -v -0.093750 -0.273438 0.781250 -v 0.132813 -0.226563 0.796875 -v -0.132813 -0.226563 0.796875 -v 0.109375 -0.132813 0.781250 -v -0.109375 -0.132813 0.781250 -v 0.039063 -0.125000 0.781250 -v -0.039063 -0.125000 0.781250 -v 0.000000 -0.203125 0.828125 -v 0.046875 -0.148438 0.812500 -v -0.046875 -0.148438 0.812500 -v 0.093750 -0.156250 0.812500 -v -0.093750 -0.156250 0.812500 -v 0.109375 -0.226563 0.828125 -v -0.109375 -0.226563 0.828125 -v 0.078125 -0.250000 0.804688 -v -0.078125 -0.250000 0.804688 -v 0.000000 -0.289063 0.804688 -v 0.257813 -0.312500 0.554688 -v -0.257813 -0.312500 0.554688 -v 0.164063 -0.242188 0.710938 -v -0.164063 -0.242188 0.710938 -v 0.179688 -0.312500 0.710938 -v -0.179688 -0.312500 0.710938 -v 0.234375 -0.250000 0.554688 -v -0.234375 -0.250000 0.554688 -v 0.000000 -0.875000 0.687500 -v 0.046875 -0.867188 0.687500 -v -0.046875 -0.867188 0.687500 -v 0.093750 -0.820313 0.710938 -v -0.093750 -0.820313 0.710938 -v 0.093750 -0.742188 0.726563 -v -0.093750 -0.742188 0.726563 -v 0.000000 -0.781250 0.656250 -v 0.093750 -0.750000 0.664063 -v -0.093750 -0.750000 0.664063 -v 0.093750 -0.812500 0.640625 -v -0.093750 -0.812500 0.640625 -v 0.046875 -0.851563 0.632813 -v -0.046875 -0.851563 0.632813 -v 0.000000 -0.859375 0.632813 -v 0.171875 0.218750 0.781250 -v -0.171875 0.218750 0.781250 -v 0.187500 0.156250 0.773438 -v -0.187500 0.156250 0.773438 -v 0.335938 0.429688 0.757813 -v -0.335938 0.429688 0.757813 -v 0.273438 0.421875 0.773438 -v -0.273438 0.421875 0.773438 -v 0.421875 0.398438 0.773438 -v -0.421875 0.398438 0.773438 -v 0.562500 0.351563 0.695313 -v -0.562500 0.351563 0.695313 -v 0.585938 0.289063 0.687500 -v -0.585938 0.289063 0.687500 -v 0.578125 0.195313 0.679688 -v -0.578125 0.195313 0.679688 -v 0.476563 0.101563 0.718750 -v -0.476563 0.101563 0.718750 -v 0.375000 0.062500 0.742188 -v -0.375000 0.062500 0.742188 -v 0.226563 0.109375 0.781250 -v -0.226563 0.109375 0.781250 -v 0.179688 0.296875 0.781250 -v -0.179688 0.296875 0.781250 -v 0.210938 0.375000 0.781250 -v -0.210938 0.375000 0.781250 -v 0.234375 0.359375 0.757813 -v -0.234375 0.359375 0.757813 -v 0.195313 0.296875 0.757813 -v -0.195313 0.296875 0.757813 -v 0.242188 0.125000 0.757813 -v -0.242188 0.125000 0.757813 -v 0.375000 0.085938 0.726563 -v -0.375000 0.085938 0.726563 -v 0.460938 0.117188 0.703125 -v -0.460938 0.117188 0.703125 -v 0.546875 0.210938 0.671875 -v -0.546875 0.210938 0.671875 -v 0.554688 0.281250 0.671875 -v -0.554688 0.281250 0.671875 -v 0.531250 0.335938 0.679688 -v -0.531250 0.335938 0.679688 -v 0.414063 0.390625 0.750000 -v -0.414063 0.390625 0.750000 -v 0.281250 0.398438 0.765625 -v -0.281250 0.398438 0.765625 -v 0.335938 0.406250 0.750000 -v -0.335938 0.406250 0.750000 -v 0.203125 0.171875 0.750000 -v -0.203125 0.171875 0.750000 -v 0.195313 0.226563 0.750000 -v -0.195313 0.226563 0.750000 +v 0.351563 0.242188 0.808125 +v 0.445313 0.15625 0.76125 +v 0.476563 0.242188 0.753438 +v -0.476563 0.242188 0.753438 +v -0.445313 0.15625 0.76125 +v -0.351563 0.242188 0.808125 +v 0.351563 0.117188 0.784688 +v -0.351563 0.117188 0.784688 +v 0.265625 0.15625 0.800313 +v -0.265625 0.15625 0.800313 +v 0.226563 0.242188 0.800313 +v -0.226563 0.242188 0.800313 +v 0.265625 0.335938 0.800313 +v -0.265625 0.335938 0.800313 +v 0.351563 0.375 0.784688 +v -0.351563 0.375 0.784688 +v 0.445313 0.335938 0.76125 +v -0.445313 0.335938 0.76125 +v 0 0.429688 0.742188 v 0.109375 0.460938 0.609375 +v 0 0.570313 0.570313 +v 0 0.570313 0.570313 v -0.109375 0.460938 0.609375 -v 0.195313 0.664063 0.617188 -v -0.195313 0.664063 0.617188 -v 0.335938 0.687500 0.593750 -v -0.335938 0.687500 0.593750 -v 0.484375 0.554688 0.554688 -v -0.484375 0.554688 0.554688 -v 0.679688 0.453125 0.492188 -v -0.679688 0.453125 0.492188 -v 0.796875 0.406250 0.460938 -v -0.796875 0.406250 0.460938 -v 0.773438 0.164063 0.375000 -v -0.773438 0.164063 0.375000 -v 0.601563 0.000000 0.414063 -v -0.601563 0.000000 0.414063 -v 0.437500 -0.093750 0.468750 -v -0.437500 -0.093750 0.468750 -v 0.000000 0.898438 0.289063 -v 0.000000 0.984375 -0.078125 -v 0.000000 -0.195313 -0.671875 -v 0.000000 -0.460938 0.187500 -v 0.000000 -0.976563 0.460938 -v 0.000000 -0.804688 0.343750 -v 0.000000 -0.570313 0.320313 -v 0.000000 -0.484375 0.281250 -v 0.851563 0.234375 0.054688 -v -0.851563 0.234375 0.054688 -v 0.859375 0.320313 -0.046875 -v -0.859375 0.320313 -0.046875 -v 0.773438 0.265625 -0.437500 -v -0.773438 0.265625 -0.437500 -v 0.460938 0.437500 -0.703125 -v -0.460938 0.437500 -0.703125 -v 0.734375 -0.046875 0.070313 -v -0.734375 -0.046875 0.070313 -v 0.593750 -0.125000 -0.164063 -v -0.593750 -0.125000 -0.164063 -v 0.640625 -0.007813 -0.429688 -v -0.640625 -0.007813 -0.429688 -v 0.335938 0.054688 -0.664063 -v -0.335938 0.054688 -0.664063 -v 0.234375 -0.351563 0.406250 -v -0.234375 -0.351563 0.406250 -v 0.179688 -0.414063 0.257813 -v -0.179688 -0.414063 0.257813 -v 0.289063 -0.710938 0.382813 -v -0.289063 -0.710938 0.382813 -v 0.250000 -0.500000 0.390625 -v -0.250000 -0.500000 0.390625 -v 0.328125 -0.914063 0.398438 -v -0.328125 -0.914063 0.398438 -v 0.140625 -0.757813 0.367188 -v -0.140625 -0.757813 0.367188 -v 0.125000 -0.539063 0.359375 -v -0.125000 -0.539063 0.359375 -v 0.164063 -0.945313 0.437500 -v -0.164063 -0.945313 0.437500 -v 0.218750 -0.281250 0.429688 -v -0.218750 -0.281250 0.429688 -v 0.210938 -0.226563 0.468750 -v -0.210938 -0.226563 0.468750 -v 0.203125 -0.171875 0.500000 -v -0.203125 -0.171875 0.500000 +v 0 0.429688 0.742188 +v 0.21875 -0.28125 0.429688 v 0.210938 -0.390625 0.164063 +v 0.59375 -0.125 -0.164063 +v -0.59375 -0.125 -0.164063 v -0.210938 -0.390625 0.164063 -v 0.296875 -0.312500 -0.265625 -v -0.296875 -0.312500 -0.265625 -v 0.343750 -0.148438 -0.539063 -v -0.343750 -0.148438 -0.539063 -v 0.453125 0.867188 -0.382813 -v -0.453125 0.867188 -0.382813 -v 0.453125 0.929688 -0.070313 -v -0.453125 0.929688 -0.070313 -v 0.453125 0.851563 0.234375 -v -0.453125 0.851563 0.234375 -v 0.460938 0.523438 0.429688 -v -0.460938 0.523438 0.429688 -v 0.726563 0.406250 0.335938 -v -0.726563 0.406250 0.335938 -v 0.632813 0.453125 0.281250 -v -0.632813 0.453125 0.281250 -v 0.640625 0.703125 0.054688 -v -0.640625 0.703125 0.054688 -v 0.796875 0.562500 0.125000 -v -0.796875 0.562500 0.125000 -v 0.796875 0.617188 -0.117188 -v -0.796875 0.617188 -0.117188 -v 0.640625 0.750000 -0.195313 -v -0.640625 0.750000 -0.195313 -v 0.640625 0.679688 -0.445313 -v -0.640625 0.679688 -0.445313 -v 0.796875 0.539063 -0.359375 -v -0.796875 0.539063 -0.359375 -v 0.617188 0.328125 -0.585938 -v -0.617188 0.328125 -0.585938 -v 0.484375 0.023438 -0.546875 -v -0.484375 0.023438 -0.546875 -v 0.820313 0.328125 -0.203125 -v -0.820313 0.328125 -0.203125 -v 0.406250 -0.171875 0.148438 -v -0.406250 -0.171875 0.148438 -v 0.429688 -0.195313 -0.210938 -v -0.429688 -0.195313 -0.210938 -v 0.890625 0.406250 -0.234375 -v -0.890625 0.406250 -0.234375 -v 0.773438 -0.140625 -0.125000 -v -0.773438 -0.140625 -0.125000 -v 1.039063 -0.101563 -0.328125 -v -1.039063 -0.101563 -0.328125 -v 1.281250 0.054688 -0.429688 -v -1.281250 0.054688 -0.429688 -v 1.351563 0.320313 -0.421875 -v -1.351563 0.320313 -0.421875 -v 1.234375 0.507813 -0.421875 -v -1.234375 0.507813 -0.421875 -v 1.023438 0.476563 -0.312500 -v -1.023438 0.476563 -0.312500 -v 1.015625 0.414063 -0.289063 -v -1.015625 0.414063 -0.289063 -v 1.187500 0.437500 -0.390625 -v -1.187500 0.437500 -0.390625 -v 1.265625 0.289063 -0.406250 -v -1.265625 0.289063 -0.406250 -v 1.210938 0.078125 -0.406250 -v -1.210938 0.078125 -0.406250 -v 1.031250 -0.039063 -0.304688 -v -1.031250 -0.039063 -0.304688 -v 0.828125 -0.070313 -0.132813 -v -0.828125 -0.070313 -0.132813 -v 0.921875 0.359375 -0.218750 -v -0.921875 0.359375 -0.218750 +v -0.21875 -0.28125 0.429688 +v 0.4375 -0.09375 0.46875 +v 0.203125 -0.171875 0.5 +v 0.210938 -0.226563 0.46875 +v -0.210938 -0.226563 0.46875 +v -0.203125 -0.171875 0.5 +v -0.4375 -0.09375 0.46875 v 0.945313 0.304688 -0.289063 -v -0.945313 0.304688 -0.289063 -v 0.882813 -0.023438 -0.210938 -v -0.882813 -0.023438 -0.210938 -v 1.039063 0.000000 -0.367188 -v -1.039063 0.000000 -0.367188 -v 1.187500 0.093750 -0.445313 -v -1.187500 0.093750 -0.445313 -v 1.234375 0.250000 -0.445313 -v -1.234375 0.250000 -0.445313 -v 1.171875 0.359375 -0.437500 -v -1.171875 0.359375 -0.437500 -v 1.023438 0.343750 -0.359375 -v -1.023438 0.343750 -0.359375 -v 0.843750 0.289063 -0.210938 -v -0.843750 0.289063 -0.210938 -v 0.835938 0.171875 -0.273438 -v -0.835938 0.171875 -0.273438 -v 0.757813 0.093750 -0.273438 -v -0.757813 0.093750 -0.273438 -v 0.820313 0.085938 -0.273438 -v -0.820313 0.085938 -0.273438 -v 0.843750 0.015625 -0.273438 -v -0.843750 0.015625 -0.273438 -v 0.812500 -0.015625 -0.273438 -v -0.812500 -0.015625 -0.273438 -v 0.726563 0.000000 -0.070313 -v -0.726563 0.000000 -0.070313 -v 0.718750 -0.023438 -0.171875 -v -0.718750 -0.023438 -0.171875 -v 0.718750 0.039063 -0.187500 -v -0.718750 0.039063 -0.187500 -v 0.796875 0.203125 -0.210938 -v -0.796875 0.203125 -0.210938 -v 0.890625 0.242188 -0.265625 -v -0.890625 0.242188 -0.265625 -v 0.890625 0.234375 -0.320313 -v -0.890625 0.234375 -0.320313 -v 0.812500 -0.015625 -0.320313 -v -0.812500 -0.015625 -0.320313 -v 0.851563 0.015625 -0.320313 -v -0.851563 0.015625 -0.320313 -v 0.828125 0.078125 -0.320313 -v -0.828125 0.078125 -0.320313 -v 0.765625 0.093750 -0.320313 -v -0.765625 0.093750 -0.320313 -v 0.843750 0.171875 -0.320313 -v -0.843750 0.171875 -0.320313 -v 1.039063 0.328125 -0.414063 -v -1.039063 0.328125 -0.414063 -v 1.187500 0.343750 -0.484375 -v -1.187500 0.343750 -0.484375 -v 1.257813 0.242188 -0.492188 -v -1.257813 0.242188 -0.492188 -v 1.210938 0.085938 -0.484375 -v -1.210938 0.085938 -0.484375 -v 1.046875 0.000000 -0.421875 -v -1.046875 0.000000 -0.421875 -v 0.882813 -0.015625 -0.265625 -v -0.882813 -0.015625 -0.265625 -v 0.953125 0.289063 -0.343750 -v -0.953125 0.289063 -0.343750 -v 0.890625 0.109375 -0.328125 -v -0.890625 0.109375 -0.328125 -v 0.937500 0.062500 -0.335938 -v -0.937500 0.062500 -0.335938 -v 1.000000 0.125000 -0.367188 -v -1.000000 0.125000 -0.367188 -v 0.960938 0.171875 -0.351563 -v -0.960938 0.171875 -0.351563 -v 1.015625 0.234375 -0.375000 -v -1.015625 0.234375 -0.375000 -v 1.054688 0.187500 -0.382813 -v -1.054688 0.187500 -0.382813 v 1.109375 0.210938 -0.390625 +v 1.171875 0.359375 -0.4375 +v -1.171875 0.359375 -0.4375 v -1.109375 0.210938 -0.390625 -v 1.085938 0.273438 -0.390625 -v -1.085938 0.273438 -0.390625 -v 1.023438 0.437500 -0.484375 -v -1.023438 0.437500 -0.484375 -v 1.250000 0.468750 -0.546875 -v -1.250000 0.468750 -0.546875 -v 1.367188 0.296875 -0.500000 -v -1.367188 0.296875 -0.500000 -v 1.312500 0.054688 -0.531250 -v -1.312500 0.054688 -0.531250 -v 1.039063 -0.085938 -0.492188 -v -1.039063 -0.085938 -0.492188 -v 0.789063 -0.125000 -0.328125 -v -0.789063 -0.125000 -0.328125 -v 0.859375 0.382813 -0.382813 +v -0.945313 0.304688 -0.289063 +v 1.25 0.46875 -0.546875 +v 1.351563 0.320313 -0.421875 +v 1.3125 0.054688 -0.53125 +v -1.3125 0.054688 -0.53125 +v -1.351563 0.320313 -0.421875 +v -1.25 0.46875 -0.546875 +v -0.789063 -0.125 -0.328125 +v -0.640625 -0.007813 -0.429688 +v -0.59375 -0.125 -0.164063 +v -0.773438 -0.140625 -0.125 +v 0.59375 -0.125 -0.164063 +v 0.640625 -0.007813 -0.429688 +v 0.789063 -0.125 -0.328125 +v 0.773438 -0.140625 -0.125 v -0.859375 0.382813 -0.382813 -v -1.023438 0.476563 -0.312500 +v -0.773438 0.265625 -0.4375 +v 0.773438 0.265625 -0.4375 +v 0.859375 0.382813 -0.382813 +v -0.890625 0.40625 -0.234375 +v -0.820313 0.328125 -0.203125 +v 0.820313 0.328125 -0.203125 +v 0.890625 0.40625 -0.234375 +v -1.039063 -0.085938 -0.492188 +v 1.039063 -0.085938 -0.492188 v -1.234375 0.507813 -0.421875 -v -0.890625 0.406250 -0.234375 +v 1.234375 0.507813 -0.421875 +v -1.28125 0.054688 -0.429688 +v 1.28125 0.054688 -0.429688 +v -1.039063 -0.101563 -0.328125 +v 1.039063 -0.101563 -0.328125 +v -1.234375 0.25 -0.445313 +v 1.234375 0.25 -0.445313 +v -1.210938 0.085938 -0.484375 +v 1.210938 0.085938 -0.484375 +v -0.8125 -0.015625 -0.273438 +v -0.882813 -0.015625 -0.265625 +v 0.8125 -0.015625 -0.273438 +v 0.882813 -0.015625 -0.265625 +v -0.765625 0.09375 -0.320313 +v 0.84375 0.171875 -0.320313 +v -0.726563 0 -0.070313 +v -0.859375 0.320313 -0.046875 +v 0.859375 0.320313 -0.046875 +v 0.726563 0 -0.070313 +v 0.820313 0.328125 -0.203125 +v -0.773438 -0.140625 -0.125 +v 0.773438 -0.140625 -0.125 +v -0.59375 -0.125 -0.164063 +v 0.59375 -0.125 -0.164063 +v 1.1875 0.4375 -0.390625 +v -1.351563 0.320313 -0.421875 +v 1.351563 0.320313 -0.421875 +v -1.28125 0.054688 -0.429688 +v 1.28125 0.054688 -0.429688 +v -1.039063 -0.101563 -0.328125 +v 1.039063 -0.101563 -0.328125 +v 1.234375 0.507813 -0.421875 +v 0.890625 0.40625 -0.234375 +v -0.34375 -0.148438 -0.539063 +v -0.640625 -0.007813 -0.429688 +v 0.34375 -0.148438 -0.539063 +v 0.640625 -0.007813 -0.429688 +v -0.460938 0.4375 -0.703125 +v -0.773438 0.265625 -0.4375 +v 0.773438 0.265625 -0.4375 +v 0.460938 0.4375 -0.703125 +v -0.726563 0 -0.070313 +v 0.726563 0 -0.070313 +v -0.796875 0.617188 -0.117188 +v -0.796875 0.539063 -0.359375 v -0.820313 0.328125 -0.203125 +v 0.796875 0.539063 -0.359375 +v 0.820313 0.328125 -0.203125 +v 0.796875 0.617188 -0.117188 +v -0.859375 0.320313 -0.046875 +v 0.859375 0.320313 -0.046875 +v -0.796875 0.40625 0.460938 +v 0.796875 0.40625 0.460938 +v -0.828125 0.148438 0.445313 +v 0.828125 0.148438 0.445313 +v -0.460938 0.523438 0.429688 +v -0.195313 0.664063 0.617188 +v 0.195313 0.664063 0.617188 +v 0.460938 0.523438 0.429688 +v -0.453125 0.851563 0.234375 +v 0 0.898438 0.289063 +v 0 0.898438 0.289063 +v 0.453125 0.851563 0.234375 +v 0 0.898438 -0.546875 +v 0 0.898438 -0.546875 +v 0 0.5625 -0.851563 +v 0 0.5625 -0.851563 +v 0 0.984375 -0.078125 +v 0 0.984375 -0.078125 +v 0 0.070313 -0.828125 +v 0 0.070313 -0.828125 +v -0.257813 -0.3125 0.554688 +v 0.257813 -0.3125 0.554688 +v 0 -0.382813 -0.351563 +v 0 -0.460938 0.1875 +v 0 -0.382813 -0.351563 +v 0 -0.460938 0.1875 +v -0.4375 -0.140625 0.53125 +v -0.203125 -0.171875 0.5 +v -0.203125 -0.1875 0.5625 +v -0.4375 -0.140625 0.53125 +v 0.203125 -0.1875 0.5625 +v 0.203125 -0.171875 0.5 +v 0.4375 -0.140625 0.53125 +v 0.4375 -0.140625 0.53125 +v -0.234375 -0.25 0.554688 +v -0.234375 -0.25 0.554688 +v 0.234375 -0.25 0.554688 +v 0.234375 -0.25 0.554688 +v -0.289063 -0.710938 0.382813 +v -0.367188 -0.890625 0.53125 +v 0.367188 -0.890625 0.53125 +v 0.25 -0.5 0.390625 +v 0.328125 -0.945313 0.523438 +v 0 -0.804688 0.34375 +v 0 -0.984375 0.578125 +v -0.328125 -0.945313 0.523438 +v 0 -0.804688 0.34375 +v 0 -0.984375 0.578125 +v -0.632813 -0.039063 0.539063 +v 0.632813 -0.039063 0.539063 +v -0.859375 0.429688 0.59375 +v 0.859375 0.429688 0.59375 +v -0.710938 0.484375 0.625 +v 0.710938 0.484375 0.625 +v -0.15625 0.71875 0.757813 +v 0.15625 0.71875 0.757813 +v -0.0625 0.492188 0.75 +v 0.0625 0.492188 0.75 +v -0.203125 0.171875 0.75 +v -0.1875 0.15625 0.773438 +v -0.171875 0.21875 0.78125 +v -0.195313 0.226563 0.75 +v 0.171875 0.21875 0.78125 +v 0.1875 0.15625 0.773438 +v 0.203125 0.171875 0.75 +v 0.195313 0.226563 0.75 +v -0.179688 0.296875 0.78125 +v -0.195313 0.296875 0.757813 +v 0.179688 0.296875 0.78125 +v 0.195313 0.296875 0.757813 +v -0.210938 0.375 0.78125 +v -0.234375 0.359375 0.757813 +v 0.210938 0.375 0.78125 +v 0.234375 0.359375 0.757813 +v -0.242188 0.125 0.757813 +v -0.226563 0.109375 0.78125 +v 0.226563 0.109375 0.78125 +v 0.242188 0.125 0.757813 +v -0.375 0.085938 0.726563 +v -0.375 0.0625 0.742188 +v 0.375 0.0625 0.742188 +v 0.375 0.085938 0.726563 +v -0.460938 0.117188 0.703125 +v -0.476563 0.101563 0.71875 +v 0.476563 0.101563 0.71875 +v 0.460938 0.117188 0.703125 +v -0.546875 0.210938 0.671875 +v -0.578125 0.195313 0.679688 +v 0.578125 0.195313 0.679688 +v 0.546875 0.210938 0.671875 +v -0.554688 0.28125 0.671875 +v -0.585938 0.289063 0.6875 +v 0.585938 0.289063 0.6875 +v 0.554688 0.28125 0.671875 +v -0.53125 0.335938 0.679688 +v -0.5625 0.351563 0.695313 +v 0.5625 0.351563 0.695313 +v 0.53125 0.335938 0.679688 +v -0.414063 0.390625 0.75 +v -0.421875 0.398438 0.773438 +v 0.421875 0.398438 0.773438 +v 0.414063 0.390625 0.75 +v -0.335938 0.40625 0.75 +v -0.335938 0.429688 0.757813 +v 0.335938 0.429688 0.757813 +v 0.335938 0.40625 0.75 +v -0.28125 0.398438 0.765625 +v -0.273438 0.421875 0.773438 +v 0.273438 0.421875 0.773438 +v 0.28125 0.398438 0.765625 +v -0.25 0.46875 0.757813 +v 0.25 0.46875 0.757813 +v -0.726563 0.203125 0.601563 +v 0.726563 0.203125 0.601563 +v -0.398438 -0.046875 0.671875 +v 0.398438 -0.046875 0.671875 +v -0.203125 0.09375 0.742188 +v 0.203125 0.09375 0.742188 +v -0.125 0.304688 0.765625 +v 0.125 0.304688 0.765625 +v 0.09375 -0.75 0.664063 +v -0.109375 -0.71875 0.734375 +v -0.046875 -0.851563 0.632813 +v -0.0625 -0.882813 0.695313 +v 0.117188 -0.835938 0.710938 +v 0.109375 -0.71875 0.734375 +v -0.164063 -0.242188 0.710938 +v -0.125 -0.101563 0.8125 +v 0.125 -0.101563 0.8125 +v 0.164063 -0.242188 0.710938 +v -0.179688 -0.3125 0.710938 +v -0.257813 -0.3125 0.554688 +v 0.257813 -0.3125 0.554688 +v 0.179688 -0.3125 0.710938 +v 0 -0.328125 0.742188 +v -0.085938 -0.289063 0.742188 +v 0.085938 -0.289063 0.742188 +v -0.125 -0.226563 0.75 +v 0.125 -0.226563 0.75 +v -0.101563 -0.148438 0.742188 +v 0.101563 -0.148438 0.742188 +v 0 -0.140625 0.742188 +v -0.09375 -0.273438 0.78125 +v 0 -0.289063 0.804688 +v 0 -0.1875 0.796875 +v 0.09375 -0.273438 0.78125 +v 0 -0.320313 0.78125 +v -0.367188 -0.890625 0.53125 +v 0.367188 -0.890625 0.53125 +v -0.328125 -0.945313 0.523438 +v 0.328125 -0.945313 0.523438 +v 0 -0.984375 0.578125 +v -0.3125 0.640625 0.835938 +v 0.3125 0.640625 0.835938 +v 0 0.429688 0.742188 +v -0.0625 0.492188 0.75 +v 0.0625 0.492188 0.75 +v -0.15625 0.71875 0.757813 +v 0.15625 0.71875 0.757813 +v -0.710938 0.484375 0.625 +v 0.710938 0.484375 0.625 +v -0.859375 0.429688 0.59375 +v 0.859375 0.429688 0.59375 +v -0.828125 0.148438 0.445313 +v 0.828125 0.148438 0.445313 +v -0.632813 -0.039063 0.539063 +v 0.632813 -0.039063 0.539063 +v -0.46875 0.242188 0.737813 +v -0.4375 0.164063 0.745625 +v 0.4375 0.164063 0.745625 +v 0.46875 0.242188 0.737813 +v -0.351563 0.132813 0.76125 +v 0.351563 0.132813 0.76125 +v -0.273438 0.164063 0.776875 +v 0.273438 0.164063 0.776875 +v -0.242188 0.242188 0.776875 +v 0.242188 0.242188 0.776875 +v -0.273438 0.328125 0.776875 +v 0.273438 0.328125 0.776875 +v -0.351563 0.359375 0.76125 +v 0.351563 0.359375 0.76125 +v -0.4375 0.328125 0.745625 +v 0.4375 0.328125 0.745625 +v -0.5625 0.242188 0.651875 +v -0.5 0.390625 0.6675 +v 0.5 0.390625 0.6675 +v 0.5625 0.242188 0.651875 +v -0.625 0.242188 0.5425 +v -0.546875 0.4375 0.558125 +v 0.546875 0.4375 0.558125 +v 0.625 0.242188 0.5425 +v -0.351563 0.515625 0.597188 +v -0.351563 0.453125 0.69875 +v 0.351563 0.453125 0.69875 +v 0.351563 0.515625 0.597188 +v -0.203125 0.390625 0.722188 +v 0.203125 0.390625 0.722188 +v -0.15625 0.4375 0.628438 +v 0.15625 0.4375 0.628438 +v -0.078125 0.242188 0.63625 +v -0.140625 0.242188 0.722188 +v 0.140625 0.242188 0.722188 +v 0.078125 0.242188 0.63625 +v -0.203125 0.09375 0.722188 +v 0.203125 0.09375 0.722188 +v -0.15625 0.054688 0.628438 +v 0.15625 0.054688 0.628438 +v -0.351563 0.03125 0.69875 +v -0.351563 -0.023438 0.597188 +v 0.351563 0.03125 0.69875 +v 0.351563 -0.023438 0.597188 +v -0.5 0.09375 0.6675 +v 0.5 0.09375 0.6675 +v -0.546875 0.054688 0.558125 +v 0.546875 0.054688 0.558125 vt 0.315596 0.792535 vt 0.331462 0.787091 vt 0.331944 0.799704 vt 0.049262 0.798007 vt 0.050304 0.785428 -vt 0.065913 0.791570 +vt 0.065913 0.79157 vt 0.321453 0.778649 vt 0.060677 0.777438 vt 0.310368 0.778802 vt 0.071744 0.778083 -vt 0.302416 0.786560 +vt 0.302416 0.78656 vt 0.079345 0.786186 vt 0.301514 0.798474 vt 0.079717 0.798128 -vt 0.308740 0.806873 +vt 0.30874 0.806873 vt 0.072125 0.806199 vt 0.321648 0.808687 vt 0.059149 0.807438 -vt 0.048462 0.201858 -vt 0.040084 0.207259 -vt 0.043232 0.202821 -vt 0.043249 0.220655 -vt 0.040093 0.216224 -vt 0.048480 0.221607 -vt 0.563710 0.649220 +vt 0.572425 0.670929 vt 0.540594 0.657349 vt 0.547067 0.627433 vt 0.974643 0.218739 vt 0.968169 0.188824 -vt 0.991286 0.196952 +vt 1 0.175243 vt 0.166564 0.702856 vt 0.160061 0.635503 -vt 0.218800 0.643864 -vt 0.646379 0.202310 +vt 0.258456 0.593142 +vt 0.686035 0.253032 vt 0.587641 0.210669 vt 0.594146 0.143318 vt 0.231653 0.710981 @@ -553,29 +367,17 @@ vt 0.174315 0.716236 vt 0.601897 0.129938 vt 0.608704 0.118775 vt 0.659234 0.135195 -vt 0.266169 0.503056 -vt 0.270502 0.531304 -vt 0.237927 0.525958 -vt 0.665505 0.320215 -vt 0.698081 0.314870 -vt 0.693747 0.343118 -vt 0.392095 0.783569 -vt 0.421339 0.774990 -vt 0.422693 0.793271 -vt 0.628129 0.465996 -vt 0.613733 0.456434 -vt 0.634389 0.436387 -vt 0.501778 0.870396 -vt 0.507486 0.857499 -vt 0.528577 0.865850 -vt 0.643384 0.583025 -vt 0.644052 0.562152 -vt 0.656465 0.561923 +vt 0.467321 0.8712 +vt 0.51102 0.84743 +vt 0.528822 0.875551 +vt 0.651887 0.586528 +vt 0.634422 0.561399 +vt 0.669345 0.535984 vt 0.766386 0.787223 -vt 0.745292 0.810963 +vt 0.756895 0.826983 vt 0.708792 0.802136 vt 0.769147 0.634951 -vt 0.732033 0.641034 +vt 0.719538 0.655221 vt 0.711181 0.618495 vt 0.849461 0.545148 vt 0.823375 0.497849 @@ -586,211 +388,97 @@ vt 0.643837 0.668801 vt 0.623443 0.718088 vt 0.572425 0.724426 vt 0.726607 0.540494 -vt 0.753364 0.518460 +vt 0.753364 0.51846 vt 0.715449 0.680462 vt 0.749227 0.698466 -vt 0.695922 0.534580 +vt 0.695922 0.53458 vt 0.693526 0.510498 vt 0.772837 0.655221 -vt 0.784620 0.679820 -vt 0.718163 0.580185 +vt 0.78462 0.67982 vt 0.809389 0.599417 -vt 0.761761 0.743313 -vt 0.667750 0.767676 -vt 0.693110 0.564191 -vt 0.797155 0.722534 +vt 0.66775 0.767676 vt 0.682009 0.616616 vt 0.795802 0.787304 -vt 0.719538 0.655221 -vt 0.756895 0.826983 vt 0.782765 0.655221 -vt 0.695179 0.821970 +vt 0.695179 0.82197 vt 0.843059 0.610497 vt 0.635588 0.780626 -vt 0.634422 0.561399 -vt 0.628274 0.581967 -vt 0.511020 0.847430 -vt 0.533908 0.850607 -vt 0.633815 0.551490 +vt 0.627145 0.592333 +vt 0.544318 0.85362 vt 0.613046 0.571327 vt 0.530368 0.831407 -vt 0.501394 0.842435 -vt 0.626589 0.538875 -vt 0.604527 0.544684 -vt 0.508929 0.810914 -vt 0.492547 0.829318 -vt 0.618247 0.522587 +vt 0.612569 0.491986 vt 0.602583 0.501781 -vt 0.480939 0.813120 +vt 0.45471 0.792385 vt 0.469234 0.787943 -vt 0.616652 0.502716 -vt 0.613925 0.497595 -vt 0.459358 0.796431 -vt 0.462840 0.801566 -vt 0.644899 0.511966 -vt 0.630336 0.517087 -vt 0.628893 0.504351 vt 0.635735 0.498392 -vt 0.458270 0.813966 -vt 0.469630 0.821874 vt 0.457144 0.833207 -vt 0.449054 0.817297 -vt 0.637359 0.534149 -vt 0.654293 0.524569 -vt 0.464258 0.849211 -vt 0.482600 0.837505 -vt 0.644187 0.548520 -vt 0.659377 0.540935 -vt 0.478087 0.863369 -vt 0.493557 0.851414 -vt 0.597230 0.539263 -vt 0.595257 0.495349 -vt 0.466971 0.777596 -vt 0.507407 0.801398 -vt 0.605628 0.572478 -vt 0.534801 0.825096 -vt 0.627145 0.592333 -vt 0.544318 0.853620 -vt 0.651887 0.586528 -vt 0.528822 0.875551 -vt 0.665532 0.557472 -vt 0.492878 0.878439 -vt 0.669345 0.535984 -vt 0.467321 0.871200 -vt 0.612569 0.491986 -vt 0.454710 0.792385 -vt 0.619277 0.495381 -vt 0.454636 0.800448 -vt 0.628580 0.496763 -vt 0.451294 0.809743 -vt 0.636682 0.490206 -vt 0.440853 0.813605 -vt 0.652342 0.504728 -vt 0.446182 0.836397 -vt 0.664409 0.519225 -vt 0.453285 0.856119 -vt 0.666191 0.492411 +vt 0.634389 0.436387 vt 0.717596 0.474672 vt 0.382398 0.879324 -vt 0.427166 0.842398 -vt 0.681733 0.511408 +vt 0.392095 0.783569 vt 0.427493 0.877628 -vt 0.435523 0.867805 -vt 0.685777 0.532869 -vt 0.453231 0.887054 -vt 0.588528 0.478377 -vt 0.454313 0.762782 -vt 0.446975 0.900429 -vt 0.713425 0.237886 -vt 0.709019 0.215724 -vt 0.755152 0.224403 -vt 0.762923 0.242445 -vt 0.327574 0.621771 -vt 0.281440 0.630451 -vt 0.285847 0.608289 -vt 0.335345 0.603729 vt 0.576794 0.465515 +vt 0.448347 0.745304 vt 0.583867 0.423087 vt 0.405805 0.730353 -vt 0.448347 0.745304 -vt 0.686035 0.253032 -vt 0.258456 0.593142 -vt 0.683851 0.556229 -vt 0.482266 0.899349 -vt 0.670531 0.597684 -vt 0.532990 0.898426 -vt 0.630909 0.604157 -vt 0.553941 0.861896 -vt 0.596864 0.576275 -vt 0.542184 0.818594 -vt 0.585561 0.529242 -vt 0.503791 0.785451 -vt 0.572425 0.529736 -vt 0.510638 0.773572 -vt 0.587548 0.588270 -vt 0.557294 0.815416 +vt 0.53299 0.898426 vt 0.629961 0.623919 vt 0.572425 0.868524 +vt 0.587548 0.58827 +vt 0.557294 0.815416 +vt 0.572425 0.529736 +vt 0.510638 0.773572 vt 0.548104 0.914571 -vt 0.488130 0.914571 -vt 0.658830 0.266292 -vt 0.631691 0.281488 -vt 0.204112 0.564686 -vt 0.231252 0.579881 +vt 0.446975 0.900429 +vt 0.665505 0.320215 vt 0.706402 0.288928 +vt 0.237927 0.525958 vt 0.278823 0.557246 -vt 0.743528 0.317934 -vt 0.752264 0.346660 -vt 0.324686 0.499513 -vt 0.315950 0.528240 -vt 0.743309 0.289810 +vt 0.752264 0.34666 +vt 0.743309 0.28981 vt 0.315731 0.556363 -vt 0.700326 0.147967 -vt 0.272746 0.698208 +vt 0.324686 0.499513 +vt 0.713425 0.237886 +vt 0.285847 0.608289 vt 0.795874 0.266472 -vt 0.775660 0.289442 +vt 0.77566 0.289442 vt 0.757507 0.263314 vt 0.348083 0.556732 -vt 0.329929 0.582860 +vt 0.329929 0.58286 vt 0.368297 0.579702 -vt 0.804056 0.232825 -vt 0.376478 0.613349 -vt 0.810124 0.179100 -vt 0.382547 0.667075 -vt 0.753847 0.157090 +vt 0.762923 0.242445 +vt 0.335345 0.603729 vt 0.811201 0.146834 vt 0.383624 0.699341 -vt 0.326269 0.689085 +vt 0.757541 0.138176 +vt 0.329963 0.708 vt 0.879685 0.183943 -vt 0.888071 0.157228 -vt 0.460496 0.688946 -vt 0.452109 0.662231 -vt 0.925222 0.140531 vt 0.947451 0.149372 vt 0.519876 0.696801 -vt 0.497647 0.705643 -vt 0.876420 0.258223 +vt 0.452109 0.662231 +vt 0.87642 0.258223 vt 0.946138 0.286262 -vt 0.518561 0.559910 +vt 0.518561 0.55991 vt 0.448843 0.587951 -vt 0.829953 0.196170 -vt 0.837053 0.152275 -vt 0.409477 0.693900 -vt 0.402377 0.650004 -vt 0.829888 0.255993 -vt 0.402311 0.590181 -vt 0.852096 0.297194 -vt 0.813695 0.289418 -vt 0.424519 0.548979 -vt 0.386117 0.556756 -vt 0.820842 0.328587 -vt 0.789451 0.311961 -vt 0.393264 0.517587 -vt 0.361873 0.534212 vt 0.840465 0.403536 -vt 0.762603 0.423087 vt 0.412887 0.442637 +vt 0.762603 0.423087 vt 0.335024 0.423087 vt 0.909248 0.345901 -vt 0.481670 0.500271 -vt 0.676670 0.402805 +vt 0.48167 0.500271 +vt 0.67667 0.402805 vt 0.249092 0.443369 -vt 0.573469 0.193539 -vt 0.579214 0.151927 -vt 0.151632 0.694246 -vt 0.145888 0.652633 -vt 0.546919 0.227092 -vt 0.536510 0.214419 -vt 0.119340 0.619080 -vt 0.108931 0.631753 +vt 0.578472 0.119429 +vt 0.15089 0.726744 vt 0.588792 0.317539 +vt 0.546919 0.227092 vt 0.161214 0.528634 -vt 0.630429 0.371564 -vt 0.202851 0.474609 +vt 0.11934 0.61908 vt 0.657494 0.118541 vt 0.164237 0.319427 vt 0.169464 0.304721 -vt 0.210459 0.345510 +vt 0.210459 0.34551 vt 0.169574 0.118572 vt 0.164356 0.103821 vt 0.210731 0.077759 @@ -799,56 +487,26 @@ vt 0.589956 0.115821 vt 0.153468 0.300432 vt 0.153526 0.122857 vt 0.162374 0.730353 -vt 0.578472 0.119429 -vt 0.553653 0.120209 -vt 0.126070 0.725964 -vt 0.150890 0.726744 -vt 0.546510 0.159800 -vt 0.509384 0.119033 -vt 0.081800 0.727137 -vt 0.118929 0.686371 -vt 0.534072 0.185482 -vt 0.106492 0.660689 -vt 0.462352 0.161885 -vt 0.478174 0.145123 -vt 0.493641 0.175543 -vt 0.505521 0.150780 -vt 0.077939 0.695390 -vt 0.050592 0.701044 -vt 0.066060 0.670626 -vt 0.034770 0.684282 +vt 0.505521 0.15078 vt 0.476706 0.124129 vt 0.049122 0.722039 -vt 0.465324 0.131169 +vt 0.118929 0.686371 vt 0.037741 0.714998 -vt 0.446348 0.149671 -vt 0.018765 0.696495 -vt 0.445483 0.184898 -vt 0.427581 0.175095 -vt 0.000000 0.671069 -vt 0.017903 0.661268 -vt 0.480167 0.198327 vt 0.052588 0.647841 -vt 0.521714 0.207472 -vt 0.094135 0.638699 +vt 0 0.671069 +vt 0.465324 0.131169 +vt 0.480167 0.198327 +vt 0.427581 0.175095 vt 0.701979 0.120236 -vt 0.274400 0.725940 -vt 0.757541 0.138176 -vt 0.329963 0.708000 +vt 0.2744 0.72594 vt 0.817327 0.117813 vt 0.389751 0.728363 vt 0.844767 0.126748 vt 0.417191 0.719428 -vt 0.893893 0.126476 -vt 0.466319 0.719698 -vt 0.936543 0.115821 -vt 0.508970 0.730353 vt 0.965717 0.128368 vt 0.538144 0.717805 vt 0.989276 0.166159 vt 0.561701 0.680013 -vt 1.000000 0.175243 -vt 0.572425 0.670929 vt 0.289028 0.269037 vt 0.283878 0.263049 vt 0.299187 0.258321 @@ -862,10 +520,10 @@ vt 0.316733 0.267304 vt 0.318078 0.163079 vt 0.317052 0.156521 vt 0.335398 0.269583 -vt 0.330421 0.276220 +vt 0.330421 0.27622 vt 0.335777 0.154335 vt 0.330824 0.147649 -vt 0.278552 0.277080 +vt 0.278552 0.27708 vt 0.273734 0.272912 vt 0.273975 0.150706 vt 0.278818 0.146548 @@ -873,13 +531,13 @@ vt 0.271078 0.306358 vt 0.264864 0.305818 vt 0.265194 0.117691 vt 0.271427 0.117166 -vt 0.278613 0.324240 +vt 0.278613 0.32424 vt 0.274006 0.327477 vt 0.274436 0.095993 vt 0.279049 0.099253 vt 0.298062 0.342565 -vt 0.294660 0.349561 -vt 0.295240 0.073895 +vt 0.29466 0.349561 +vt 0.29524 0.073895 vt 0.298634 0.080932 vt 0.312476 0.342961 vt 0.315033 0.350198 @@ -888,12 +546,12 @@ vt 0.313108 0.080584 vt 0.323281 0.337709 vt 0.328696 0.344302 vt 0.329405 0.079293 -vt 0.323940 0.085897 +vt 0.32394 0.085897 vt 0.335361 0.313857 vt 0.339396 0.315576 vt 0.340031 0.108187 vt 0.335968 0.109893 -vt 0.339920 0.298303 +vt 0.33992 0.298303 vt 0.345292 0.298556 vt 0.345869 0.125306 vt 0.340471 0.125531 @@ -901,158 +559,63 @@ vt 0.339277 0.286081 vt 0.344398 0.284332 vt 0.344895 0.139582 vt 0.339764 0.137799 -vt 0.345671 0.260159 vt 0.355483 0.280619 vt 0.356003 0.143373 -vt 0.346021 0.163854 -vt 0.356162 0.297750 -vt 0.356783 0.126174 -vt 0.349494 0.319809 -vt 0.350195 0.103982 -vt 0.333524 0.354692 -vt 0.334295 0.068869 -vt 0.317323 0.364551 -vt 0.318050 0.058911 -vt 0.293154 0.361782 -vt 0.293765 0.061619 -vt 0.263750 0.335417 -vt 0.264168 0.087998 -vt 0.251373 0.309082 -vt 0.251676 0.114380 +vt 0.296951 0.385966 +vt 0.29765 0.037339 +vt 0.236517 0.317748 +vt 0.236802 0.105655 vt 0.264926 0.265507 vt 0.265122 0.158092 -vt 0.278030 0.255522 -vt 0.278212 0.168150 vt 0.320744 0.246538 vt 0.320956 0.177355 -vt 0.296570 0.247318 -vt 0.296748 0.176443 -vt 0.038845 0.211743 -vt 0.047440 0.211734 -vt 0.055230 0.211728 -vt 0.057303 0.228458 -vt 0.057278 0.194991 -vt 0.041287 0.229096 -vt 0.041253 0.194380 -vt 0.032564 0.220061 -vt 0.032546 0.203437 -vt 0.030743 0.211752 +vt 0.048462 0.201858 +vt 0.061533 0.231825 +vt 0.040093 0.216224 vt 0.029931 0.223131 -vt 0.028053 0.211756 -vt 0.029906 0.200372 -vt 0.038587 0.233067 vt 0.038544 0.190412 -vt 0.061533 0.231825 vt 0.061505 0.191616 -vt 0.057382 0.211726 vt 0.168191 0.258703 vt 0.213958 0.246887 -vt 0.214040 0.176591 +vt 0.21404 0.176591 vt 0.168236 0.164676 vt 0.148297 0.258447 vt 0.138777 0.299079 vt 0.138791 0.124216 vt 0.148319 0.164919 -vt 0.115455 0.259296 -vt 0.109657 0.296761 -vt 0.109611 0.126556 -vt 0.115440 0.164070 -vt 0.119233 0.228698 -vt 0.156540 0.233552 +vt 0.148476 0.211699 +vt 0.15654 0.233552 vt 0.156556 0.189842 -vt 0.119230 0.194690 vt 0.173998 0.244074 vt 0.174035 0.179329 -vt 0.195860 0.238258 +vt 0.19586 0.238258 vt 0.195909 0.185188 vt 0.203534 0.211734 -vt 0.252997 0.211802 -vt 0.171285 0.225095 -vt 0.164455 0.211704 -vt 0.180017 0.211713 -vt 0.177113 0.227468 -vt 0.171300 0.198319 -vt 0.177134 0.195952 -vt 0.185539 0.227013 -vt 0.187516 0.221322 -vt 0.187531 0.202116 -vt 0.185563 0.196419 -vt 0.176585 0.232500 vt 0.165993 0.229894 -vt 0.176611 0.190916 -vt 0.166011 0.193512 -vt 0.189406 0.230672 -vt 0.189438 0.192766 -vt 0.193574 0.221791 -vt 0.193592 0.201656 +vt 0.164455 0.211704 vt 0.186479 0.211718 +vt 0.166011 0.193512 vt 0.156919 0.211701 -vt 0.148476 0.211699 -vt 0.427853 0.115821 -vt 0.427581 0.104121 -vt 0.441185 0.104121 -vt 0.427581 0.011703 -vt 0.427581 0.000000 -vt 0.441181 0.011386 -vt 0.067509 0.234045 -vt 0.071465 0.211716 -vt 0.067479 0.189385 -vt 0.119764 0.211696 -vt 0.060932 0.261035 -vt 0.038121 0.261699 -vt 0.038025 0.161756 -vt 0.060860 0.162382 -vt 0.019864 0.255578 -vt 0.019760 0.167921 -vt 0.016617 0.242679 -vt 0.016537 0.180842 -vt 0.014466 0.211775 -vt 0.297831 0.211892 -vt 0.340508 0.212027 -vt 0.356498 0.241635 -vt 0.356742 0.182510 -vt 0.236517 0.317748 -vt 0.236802 0.105655 -vt 0.264789 0.363401 -vt 0.265286 0.059917 -vt 0.296951 0.385966 -vt 0.297650 0.037339 -vt 0.337996 0.385300 -vt 0.338890 0.038126 -vt 0.349401 0.368365 -vt 0.350300 0.055183 -vt 0.377282 0.319664 -vt 0.378129 0.104260 +vt 0.014495 0.288026 +vt 0.014318 0.135436 +vt 0.003828 0.279132 +vt 0.00365 0.144368 +vt 0 0.211799 vt 0.394788 0.292204 vt 0.395576 0.131978 -vt 0.391029 0.270263 -vt 0.391643 0.154015 vt 0.368661 0.212151 vt 0.379482 0.228055 vt 0.379686 0.196331 vt 0.420379 0.261837 vt 0.421104 0.162716 -vt 0.426533 0.298960 -vt 0.427581 0.125377 -vt 0.396664 0.342212 -vt 0.397734 0.081667 vt 0.365156 0.387054 vt 0.366203 0.036443 vt 0.346744 0.416452 vt 0.347768 0.006839 vt 0.278009 0.423087 -vt 0.278714 0.000000 +vt 0.278714 0 vt 0.241964 0.376122 vt 0.242399 0.047096 -vt 0.055563 0.291878 -vt 0.055443 0.131506 -vt 0.014495 0.288026 -vt 0.014318 0.135436 -vt 0.003828 0.279132 -vt 0.003650 0.144368 -vt 0.000113 0.248111 -vt 0.000000 0.175447 -vt 0.000000 0.211799 vt 0.046962 0.798865 vt 0.047306 0.784561 vt 0.334495 0.786358 @@ -1073,7 +636,7 @@ vt 0.024988 0.807478 vt 0.047717 0.829014 vt 0.332112 0.830749 vt 0.355774 0.810244 -vt 0.000000 0.817350 +vt 0 0.81735 vt 0.033121 0.852785 vt 0.345638 0.855146 vt 0.380299 0.821215 @@ -1082,12 +645,12 @@ vt 0.078555 0.829097 vt 0.301299 0.829463 vt 0.295318 0.855146 vt 0.100718 0.807888 -vt 0.280100 0.807291 +vt 0.2801 0.807291 vt 0.123146 0.821929 -vt 0.257070 0.820323 -vt 0.127501 0.768220 +vt 0.25707 0.820323 +vt 0.127501 0.76822 vt 0.103229 0.776171 -vt 0.279000 0.775494 +vt 0.279 0.775494 vt 0.255105 0.766472 vt 0.079351 0.756089 vt 0.303746 0.756492 @@ -1097,9 +660,9 @@ vt 0.049398 0.755271 vt 0.035422 0.733227 vt 0.333706 0.757005 vt 0.348646 0.735604 -vt 0.026877 0.776230 +vt 0.026877 0.77623 vt 0.355274 0.778943 -vt 0.000000 0.770061 +vt 0 0.770061 vt 0.382398 0.773973 vn 0.189764 -0.003571 0.981811 vn 0.646809 -0.758202 0.082095 @@ -1111,59 +674,43 @@ vn -0.085788 -0.982971 0.162389 vn 0.085788 -0.982971 0.162389 vn -0.744835 -0.623768 0.236824 vn 0.744835 -0.623768 0.236824 -vn -0.870968 -0.014710 0.491104 -vn 0.870968 -0.014710 0.491104 +vn -0.870968 -0.01471 0.491104 +vn 0.870968 -0.01471 0.491104 vn -0.758354 0.606128 0.239692 vn 0.758354 0.606128 0.239692 vn -0.085788 0.982513 0.165105 vn 0.085788 0.982513 0.165105 vn 0.655141 0.750633 0.085574 vn -0.655141 0.750633 0.085574 -vn -0.349284 -0.719932 0.599719 -vn -0.173681 0.215735 0.960845 -vn -0.809839 0.388287 0.439741 -vn 0.809839 0.388287 0.439741 -vn 0.173681 0.215735 0.960845 -vn 0.349284 -0.719932 0.599719 -vn 0.000000 0.794183 0.607654 +vn 0 0.970214 0.242164 vn -0.508652 0.858119 -0.069887 -vn 0.000000 0.487075 0.873348 +vn 0 0.487075 0.873348 +vn 0 0.487075 0.873348 vn 0.508652 0.858119 -0.069887 +vn 0 0.970214 0.242164 vn 0.981414 -0.186682 0.043947 vn 0.569811 -0.821711 0.007813 -vn 0.563463 -0.814570 0.137669 -vn -0.563463 -0.814570 0.137669 +vn 0.330546 -0.943236 0.031281 +vn -0.330546 -0.943236 0.031281 vn -0.569811 -0.821711 0.007813 vn -0.981414 -0.186682 0.043947 vn 0.475845 -0.876247 0.075381 -vn 0.850520 -0.525529 -0.020692 +vn 0.85052 -0.525529 -0.020692 vn 0.876949 -0.163823 0.451766 vn -0.876949 -0.163823 0.451766 -vn -0.850520 -0.525529 -0.020692 +vn -0.85052 -0.525529 -0.020692 vn -0.475845 -0.876247 0.075381 -vn 0.448286 -0.367870 -0.814661 -vn 0.530534 -0.539445 -0.653829 -vn 0.513077 -0.674673 -0.530595 -vn -0.513077 -0.674673 -0.530595 -vn -0.530534 -0.539445 -0.653829 -vn -0.448286 -0.367870 -0.814661 -vn 0.888180 -0.439955 -0.132389 -vn 0.588519 0.226966 0.775933 -vn 0.911527 -0.115268 0.394665 -vn -0.911527 -0.115268 0.394665 -vn -0.588519 0.226966 0.775933 -vn -0.888180 -0.439955 -0.132389 -vn 0.468886 -0.304727 0.829005 -vn 0.251564 0.260781 0.932005 -vn -0.003082 -0.330882 0.943632 -vn 0.003082 -0.330882 0.943632 -vn -0.251564 0.260781 0.932005 -vn -0.468886 -0.304727 0.829005 +vn 0.690054 -0.553209 0.466628 +vn 0.437483 0.001221 0.899197 +vn -0.200934 -0.758141 0.62035 +vn 0.200934 -0.758141 0.62035 +vn -0.437483 0.001221 0.899197 +vn -0.690054 -0.553209 0.466628 vn 0.473067 0.578997 -0.664022 -vn 0.992462 0.028626 -0.118900 +vn 0.716392 0.204474 0.667043 vn 0.459975 -0.380261 -0.802362 vn -0.459975 -0.380261 -0.802362 -vn -0.992462 0.028626 -0.118900 +vn -0.716392 0.204474 0.667043 vn -0.473067 0.578997 -0.664022 vn -0.059908 -0.804712 -0.590594 vn -0.346141 -0.637287 -0.688498 @@ -1178,224 +725,126 @@ vn -0.626057 -0.002686 -0.779748 vn 0.626057 -0.002686 -0.779748 vn -0.593738 0.595264 -0.541368 vn 0.127689 0.703757 0.698843 -vn -0.713828 0.382183 0.586810 -vn 0.713828 0.382183 0.586810 +vn -0.713828 0.382183 0.58681 +vn 0.713828 0.382183 0.58681 vn -0.127689 0.703757 0.698843 -vn 0.378063 0.560045 -0.737144 vn 0.036805 -0.708457 -0.704764 -vn -0.378063 0.560045 -0.737144 vn -0.036805 -0.708457 -0.704764 -vn -0.031556 0.838710 0.543626 -vn 0.031556 0.838710 0.543626 vn -0.361156 0.848689 0.386303 vn 0.361156 0.848689 0.386303 -vn -0.716392 0.204474 0.667043 -vn 0.716392 0.204474 0.667043 -vn -0.662038 -0.413770 0.624866 -vn 0.662038 -0.413770 0.624866 -vn -0.530229 -0.655751 0.537370 -vn 0.530229 -0.655751 0.537370 -vn -0.437483 0.001221 0.899197 -vn 0.550981 -0.138096 0.822993 -vn 0.437483 0.001221 0.899197 -vn -0.550981 -0.138096 0.822993 -vn -0.315958 -0.102298 0.943205 +vn -0.662038 -0.41377 0.624866 +vn 0.662038 -0.41377 0.624866 +vn -0.530229 -0.655751 0.53737 +vn 0.530229 -0.655751 0.53737 +vn 0.99469 -0.078005 0.067019 +vn -0.99469 -0.078005 0.067019 vn 0.608539 0.296121 0.736167 vn -0.608539 0.296121 0.736167 -vn 0.315958 -0.102298 0.943205 -vn -0.445479 -0.088778 0.890866 -vn -0.257698 0.600024 0.757317 -vn 0.257698 0.600024 0.757317 -vn 0.445479 -0.088778 0.890866 -vn -0.327799 0.169927 0.929319 -vn 0.041780 0.927213 0.372112 -vn 0.327799 0.169927 0.929319 -vn -0.041780 0.927213 0.372112 -vn -0.277932 0.260201 0.924680 -vn -0.750725 0.111545 0.651112 -vn 0.750725 0.111545 0.651112 -vn 0.277932 0.260201 0.924680 -vn -0.437910 -0.293985 0.849574 -vn -0.183782 0.036836 0.982269 -vn -0.554216 0.387219 0.736808 -vn -0.814325 0.253426 0.522111 -vn 0.554216 0.387219 0.736808 -vn 0.183782 0.036836 0.982269 -vn 0.437910 -0.293985 0.849574 -vn 0.814325 0.253426 0.522111 -vn -0.326670 -0.001617 0.945128 -vn -0.704337 -0.526872 0.475692 -vn 0.704337 -0.526872 0.475692 -vn 0.326670 -0.001617 0.945128 -vn -0.308786 0.134617 0.941527 -vn -0.629170 -0.371441 0.682730 -vn 0.629170 -0.371441 0.682730 -vn 0.308786 0.134617 0.941527 -vn 0.146184 0.948637 0.280465 -vn -0.137516 0.905820 0.400708 -vn 0.137516 0.905820 0.400708 -vn -0.146184 0.948637 0.280465 -vn 0.723746 0.690023 -0.005219 -vn -0.723746 0.690023 -0.005219 -vn 0.994690 -0.078005 0.067019 -vn -0.994690 -0.078005 0.067019 -vn 0.200934 -0.758141 0.620350 -vn -0.200934 -0.758141 0.620350 -vn -0.541246 -0.672658 0.504501 -vn 0.541246 -0.672658 0.504501 -vn -0.690054 -0.553209 0.466628 -vn 0.690054 -0.553209 0.466628 vn -0.464003 0.686666 0.559557 +vn 0.04178 0.927213 0.372112 vn 0.464003 0.686666 0.559557 -vn -0.827448 -0.135899 0.544786 -vn 0.827448 -0.135899 0.544786 -vn -0.466231 0.808863 0.358196 -vn 0.466231 0.808863 0.358196 -vn -0.743980 -0.022919 0.667776 -vn 0.743980 -0.022919 0.667776 -vn -0.711295 -0.638325 0.294137 -vn 0.711295 -0.638325 0.294137 -vn -0.709769 -0.501999 0.494125 -vn 0.709769 -0.501999 0.494125 -vn -0.818903 -0.425520 0.385113 +vn -0.04178 0.927213 0.372112 +vn -0.814325 0.253426 0.522111 +vn 0.43791 -0.293985 0.849574 +vn -0.88818 -0.439955 -0.132389 vn -0.992523 -0.071444 -0.098758 vn 0.992523 -0.071444 -0.098758 -vn 0.818903 -0.425520 0.385113 -vn -0.439192 -0.273568 0.855708 -vn 0.439192 -0.273568 0.855708 -vn -0.414686 -0.059877 0.907956 -vn 0.414686 -0.059877 0.907956 -vn -0.341563 0.452132 0.823939 -vn 0.341563 0.452132 0.823939 -vn -0.724509 -0.684927 0.076632 -vn -0.987548 -0.123020 0.097995 -vn 0.987548 -0.123020 0.097995 -vn 0.724509 -0.684927 0.076632 -vn -0.572741 -0.088443 0.814936 -vn 0.572741 -0.088443 0.814936 -vn -0.291818 -0.152104 0.944273 +vn 0.88818 -0.439955 -0.132389 +vn 0.713828 0.382183 0.58681 +vn -0.073672 -0.594989 0.800317 +vn 0.073672 -0.594989 0.800317 +vn -0.330546 -0.943236 0.031281 +vn 0.330546 -0.943236 0.031281 vn 0.291818 -0.152104 0.944273 -vn 0.239662 -0.128605 0.962279 -vn -0.239662 -0.128605 0.962279 -vn 0.187017 0.370678 0.909696 -vn -0.187017 0.370678 0.909696 -vn -0.455794 0.423170 0.783044 -vn 0.455794 0.423170 0.783044 -vn -0.543504 -0.813379 -0.207343 -vn -0.560045 -0.814417 -0.151738 -vn 0.560045 -0.814417 -0.151738 -vn 0.543504 -0.813379 -0.207343 -vn -0.615375 -0.087649 -0.783319 -vn -0.447310 0.229530 -0.864406 -vn 0.447310 0.229530 -0.864406 -vn 0.615375 -0.087649 -0.783319 -vn -0.547166 -0.832179 -0.089785 -vn 0.547166 -0.832179 -0.089785 +vn -0.716392 0.204474 0.667043 +vn 0.716392 0.204474 0.667043 +vn -0.662038 -0.41377 0.624866 +vn 0.662038 -0.41377 0.624866 +vn -0.530229 -0.655751 0.53737 +vn 0.530229 -0.655751 0.53737 +vn 0.361156 0.848689 0.386303 +vn -0.127689 0.703757 0.698843 +vn -0.513077 -0.674673 -0.530595 +vn -0.346141 -0.637287 -0.688498 +vn 0.513077 -0.674673 -0.530595 +vn 0.346141 -0.637287 -0.688498 +vn -0.44731 0.22953 -0.864406 +vn -0.626057 -0.002686 -0.779748 +vn 0.626057 -0.002686 -0.779748 +vn 0.44731 0.22953 -0.864406 +vn -0.88818 -0.439955 -0.132389 +vn 0.88818 -0.439955 -0.132389 vn -0.873135 0.486984 -0.020264 vn -0.865352 0.331217 -0.376049 +vn -0.713828 0.382183 0.58681 vn 0.865352 0.331217 -0.376049 +vn 0.713828 0.382183 0.58681 vn 0.873135 0.486984 -0.020264 -vn -0.748741 0.518387 0.413038 -vn 0.748741 0.518387 0.413038 -vn -0.766167 0.634816 0.099612 -vn 0.766167 0.634816 0.099612 -vn -0.953185 -0.248299 -0.172430 +vn -0.992523 -0.071444 -0.098758 +vn 0.992523 -0.071444 -0.098758 vn -0.665639 0.602496 -0.440321 vn 0.665639 0.602496 -0.440321 -vn 0.953185 -0.248299 -0.172430 +vn -0.890988 -0.423261 -0.164037 +vn 0.890988 -0.423261 -0.164037 vn -0.322642 0.847713 0.421033 -vn -0.188574 0.788934 -0.584765 -vn 0.188574 0.788934 -0.584765 -vn 0.322642 0.847713 0.421033 -vn -0.239784 0.745262 -0.622120 vn 0.494247 0.520585 -0.696158 vn -0.494247 0.520585 -0.696158 -vn 0.239784 0.745262 -0.622120 +vn 0.322642 0.847713 0.421033 vn -0.480697 0.731223 0.483932 -vn 0.000000 0.758690 0.651418 +vn 0 0.75869 0.651418 +vn 0 0.75869 0.651418 vn 0.480697 0.731223 0.483932 -vn -0.489242 0.762963 0.422498 -vn -0.363109 0.908567 -0.206458 -vn 0.363109 0.908567 -0.206458 -vn 0.489242 0.762963 0.422498 -vn -0.645039 0.694540 0.318613 -vn 0.645039 0.694540 0.318613 -vn -0.492843 0.869015 0.043062 -vn -0.679434 0.728965 -0.083468 -vn 0.492843 0.869015 0.043062 -vn 0.679434 0.728965 -0.083468 -vn -0.391736 0.826014 -0.405225 -vn -0.644398 0.527207 -0.553880 -vn 0.391736 0.826014 -0.405225 -vn 0.644398 0.527207 -0.553880 -vn 0.000000 0.800714 -0.599017 -vn 0.000000 0.330729 -0.943693 -vn 0.000000 0.999664 0.025636 -vn 0.000000 -0.271462 -0.962432 -vn -0.685293 -0.583148 -0.436232 -vn -0.907224 0.252602 -0.336253 -vn 0.907224 0.252602 -0.336253 -vn 0.685293 -0.583148 -0.436232 -vn 0.000000 -0.984344 -0.176214 -vn 0.000000 -0.736351 -0.676565 -vn 0.000000 -0.948759 -0.315928 -vn 0.000000 -0.648244 -0.761406 +vn 0 0.800714 -0.599017 +vn 0 0.800714 -0.599017 +vn 0 0.330729 -0.943693 +vn 0 0.330729 -0.943693 +vn 0 0.999664 0.025636 +vn 0 0.999664 0.025636 +vn 0 -0.271462 -0.962432 +vn 0 -0.271462 -0.962432 +vn -0.930631 0.340159 0.13477 +vn 0.930631 0.340159 0.13477 +vn 0 -0.948759 -0.315928 +vn 0 -0.984344 -0.176214 +vn 0 -0.948759 -0.315928 +vn 0 -0.984344 -0.176214 vn -0.317362 -0.946959 -0.049959 +vn -0.85052 -0.525529 -0.020692 vn -0.838282 -0.408155 0.361461 +vn -0.317362 -0.946959 -0.049959 vn 0.838282 -0.408155 0.361461 +vn 0.85052 -0.525529 -0.020692 vn 0.317362 -0.946959 -0.049959 -vn -0.939360 0.325999 0.106113 -vn 0.939360 0.325999 0.106113 -vn -0.930631 0.340159 0.134770 -vn -0.960143 0.231361 0.156774 -vn 0.960143 0.231361 0.156774 -vn 0.930631 0.340159 0.134770 -vn -0.812555 -0.001068 -0.582842 -vn -0.979583 0.093387 0.177862 -vn 0.979583 0.093387 0.177862 -vn 0.812555 -0.001068 -0.582842 -vn -0.272530 -0.301157 -0.913785 -vn 0.272530 -0.301157 -0.913785 -vn -0.090915 -0.776330 -0.623707 -vn -0.506851 -0.488144 -0.710471 -vn -0.142521 -0.147282 -0.978759 +vn 0.317362 -0.946959 -0.049959 +vn -0.93936 0.325999 0.106113 +vn -0.93936 0.325999 0.106113 +vn 0.93936 0.325999 0.106113 +vn 0.93936 0.325999 0.106113 vn -0.637257 0.093326 -0.764946 -vn 0.637257 0.093326 -0.764946 -vn 0.506851 -0.488144 -0.710471 -vn 0.142521 -0.147282 -0.978759 -vn 0.090915 -0.776330 -0.623707 -vn -0.937284 -0.254250 0.238350 -vn 0.937284 -0.254250 0.238350 -vn -0.430525 -0.895260 0.114597 -vn 0.430525 -0.895260 0.114597 -vn -0.158391 -0.974822 0.156774 -vn 0.158391 -0.974822 0.156774 -vn 0.000000 -0.915860 -0.401440 -vn 0.000000 -0.946440 0.322855 -vn 0.000000 -0.336802 -0.941557 -vn 0.000000 -0.175726 -0.984436 -vn -0.599231 -0.773980 0.204566 -vn 0.599231 -0.773980 0.204566 -vn -0.890988 -0.423261 -0.164037 -vn 0.890988 -0.423261 -0.164037 +vn -0.937284 -0.25425 0.23835 +vn 0.937284 -0.25425 0.23835 +vn 0.812555 -0.001068 -0.582842 +vn 0.430525 -0.89526 0.114597 +vn 0 -0.336802 -0.941557 +vn 0 -0.94644 0.322855 +vn -0.430525 -0.89526 0.114597 +vn 0 -0.336802 -0.941557 +vn 0 -0.94644 0.322855 +vn -0.599231 -0.77398 0.204566 +vn 0.599231 -0.77398 0.204566 vn -0.851985 0.219275 0.475387 vn 0.851985 0.219275 0.475387 vn -0.509171 0.852229 0.119999 vn 0.509171 0.852229 0.119999 -vn -0.610431 0.759148 0.225867 -vn 0.610431 0.759148 0.225867 -vn -0.182470 0.981780 0.052492 -vn 0.182470 0.981780 0.052492 vn 0.520371 0.770348 0.368389 vn -0.520371 0.770348 0.368389 vn 0.852718 0.504257 0.136204 vn -0.852718 0.504257 0.136204 -vn 0.000000 0.970214 0.242164 vn -0.709647 0.261818 0.654042 vn 0.067293 -0.064272 0.995636 -vn -0.246590 -0.034089 0.968505 +vn -0.24659 -0.034089 0.968505 vn -0.809717 -0.010224 0.586688 -vn 0.246590 -0.034089 0.968505 +vn 0.24659 -0.034089 0.968505 vn -0.067293 -0.064272 0.995636 vn 0.709647 0.261818 0.654042 vn 0.809717 -0.010224 0.586688 @@ -1407,21 +856,21 @@ vn -0.211951 -0.085971 0.973479 vn -0.367504 -0.376476 0.850398 vn 0.211951 -0.085971 0.973479 vn 0.367504 -0.376476 0.850398 -vn -0.430280 0.556597 0.710624 +vn -0.43028 0.556597 0.710624 vn -0.020081 -0.072939 0.997131 vn 0.020081 -0.072939 0.997131 -vn 0.430280 0.556597 0.710624 +vn 0.43028 0.556597 0.710624 vn -0.090976 0.597339 0.796777 vn -0.187933 -0.091617 0.977874 vn 0.187933 -0.091617 0.977874 vn 0.090976 0.597339 0.796777 vn 0.165929 0.609363 0.775292 -vn -0.203314 0.092532 0.974700 -vn 0.203314 0.092532 0.974700 +vn -0.203314 0.092532 0.9747 +vn 0.203314 0.092532 0.9747 vn -0.165929 0.609363 0.775292 vn 0.269295 0.241676 0.932218 -vn -0.314219 -0.132420 0.940062 -vn 0.314219 -0.132420 0.940062 +vn -0.314219 -0.13242 0.940062 +vn 0.314219 -0.13242 0.940062 vn -0.269295 0.241676 0.932218 vn 0.420057 -0.118992 0.899625 vn -0.119755 -0.070925 0.990234 @@ -1431,135 +880,75 @@ vn 0.226142 -0.606586 0.762139 vn -0.320841 0.040712 0.946226 vn 0.320841 0.040712 0.946226 vn -0.226142 -0.606586 0.762139 -vn 0.232612 -0.746055 0.623890 +vn 0.232612 -0.746055 0.62389 vn -0.074557 -0.391644 0.917081 vn 0.074557 -0.391644 0.917081 -vn -0.232612 -0.746055 0.623890 -vn -0.121250 -0.313883 0.941679 +vn -0.232612 -0.746055 0.62389 +vn -0.12125 -0.313883 0.941679 vn -0.146702 -0.035707 0.988525 vn 0.146702 -0.035707 0.988525 -vn 0.121250 -0.313883 0.941679 -vn -0.216834 -0.273721 0.937010 -vn -0.187445 0.001160 0.982269 -vn 0.187445 0.001160 0.982269 -vn 0.216834 -0.273721 0.937010 -vn -0.303018 -0.201941 0.931333 -vn -0.253090 -0.161809 0.953795 -vn 0.253090 -0.161809 0.953795 -vn 0.303018 -0.201941 0.931333 -vn -0.140110 -0.091189 0.985900 -vn 0.140110 -0.091189 0.985900 -vn -0.237983 0.050172 0.969939 -vn 0.237983 0.050172 0.969939 -vn -0.312662 -0.237922 0.919553 -vn 0.312662 -0.237922 0.919553 -vn -0.373791 -0.105197 0.921506 -vn 0.373791 -0.105197 0.921506 -vn -0.470595 -0.164647 0.866817 -vn 0.470595 -0.164647 0.866817 -vn -0.439222 -0.376141 0.815821 -vn 0.439222 -0.376141 0.815821 -vn -0.219611 -0.540635 0.812037 -vn 0.219611 -0.540635 0.812037 +vn 0.12125 -0.313883 0.941679 +vn -0.216834 -0.273721 0.93701 +vn -0.187445 0.00116 0.982269 +vn 0.187445 0.00116 0.982269 +vn 0.216834 -0.273721 0.93701 +vn -0.25309 -0.161809 0.953795 +vn 0.25309 -0.161809 0.953795 +vn -0.543474 -0.308603 0.780602 +vn 0.543474 -0.308603 0.780602 +vn -0.336283 -0.512833 0.78985 +vn 0.336283 -0.512833 0.78985 vn 0.166967 -0.374828 0.911893 vn -0.166967 -0.374828 0.911893 -vn 0.201849 -0.277596 0.939238 -vn -0.201849 -0.277596 0.939238 -vn 0.001160 -0.165563 0.986175 -vn -0.001160 -0.165563 0.986175 -vn 0.292917 -0.174108 0.940123 -vn -0.292917 -0.174108 0.940123 -vn 0.000000 0.732200 0.681051 -vn 0.000000 -0.603626 0.797266 -vn 0.000000 -0.971740 0.235908 -vn 0.131779 -0.608295 0.782678 -vn -0.131779 -0.608295 0.782678 -vn 0.759117 0.068392 0.647298 -vn -0.759117 0.068392 0.647298 -vn 0.405957 0.643605 0.648793 -vn -0.405957 0.643605 0.648793 -vn 0.000000 0.598346 0.801202 +vn 0.00116 -0.165563 0.986175 +vn -0.00116 -0.165563 0.986175 +vn -0.349284 -0.719932 0.599719 +vn -0.141881 -0.14835 0.978698 +vn 0.173681 0.215735 0.960845 vn 0.073855 -0.330546 0.940855 -vn 0.000000 -0.124516 0.992187 -vn -0.073855 -0.330546 0.940855 -vn -0.085116 -0.339244 0.936827 vn 0.085116 -0.339244 0.936827 -vn -0.141881 -0.148350 0.978698 -vn 0.141881 -0.148350 0.978698 -vn 0.000000 -0.482803 0.875698 +vn 0.141881 -0.14835 0.978698 vn -0.692984 -0.001343 0.720908 -vn -0.095523 -0.326090 0.940489 -vn 0.095523 -0.326090 0.940489 +vn -0.095523 -0.32609 0.940489 +vn 0.095523 -0.32609 0.940489 vn 0.692984 -0.001343 0.720908 vn -0.646687 0.162603 0.745201 +vn -0.930631 0.340159 0.13477 +vn 0.930631 0.340159 0.13477 vn 0.646687 0.162603 0.745201 -vn -0.593463 0.121860 0.795556 -vn 0.593463 0.121860 0.795556 -vn -0.124363 0.009674 0.992187 +vn 0 -0.336772 0.941557 vn -0.509995 -0.457717 0.728233 vn 0.509995 -0.457717 0.728233 -vn 0.124363 0.009674 0.992187 vn -0.972137 -0.167882 0.163549 vn 0.972137 -0.167882 0.163549 vn -0.715995 0.572161 0.399945 vn 0.715995 0.572161 0.399945 -vn 0.000000 0.430525 0.902554 -vn 0.000000 0.010865 0.999939 -vn -0.221839 -0.606037 0.763848 -vn 0.000000 -0.492935 0.870022 -vn 0.000000 0.010315 0.999939 -vn -0.294320 -0.184484 0.937712 -vn 0.221839 -0.606037 0.763848 -vn 0.294320 -0.184484 0.937712 -vn -0.396924 0.534989 0.745781 -vn 0.247780 0.568224 0.784661 -vn -0.247780 0.568224 0.784661 -vn 0.396924 0.534989 0.745781 -vn -0.868221 -0.261330 0.421735 +vn 0 0.430525 0.902554 vn -0.555986 -0.690695 0.462355 -vn 0.868221 -0.261330 0.421735 +vn 0 -0.492935 0.870022 +vn 0 0.788965 0.614399 vn 0.555986 -0.690695 0.462355 -vn -0.753075 0.649892 0.102298 -vn 0.753075 0.649892 0.102298 -vn 0.194189 0.935697 0.294473 -vn -0.194189 0.935697 0.294473 -vn 0.000000 0.788965 0.614399 -vn 0.000000 -0.888638 0.458571 -vn 0.000000 -0.336772 0.941557 -vn 0.000000 -0.251991 0.967711 -vn -0.188360 -0.040132 0.981262 -vn 0.000000 -0.032899 0.999451 -vn 0.188360 -0.040132 0.981262 -vn 0.000000 0.000000 1.000000 -vn -0.572039 -0.018708 0.820002 -vn -0.536332 -0.212409 0.816828 -vn 0.536332 -0.212409 0.816828 -vn 0.572039 -0.018708 0.820002 -vn -0.357707 -0.638325 0.681570 -vn 0.357707 -0.638325 0.681570 -vn -0.154302 -0.754112 0.638325 -vn 0.154302 -0.754112 0.638325 -vn 0.000000 -0.743461 0.668752 -vn 0.000000 -0.189123 0.981933 -vn 0.000000 -0.114475 0.993408 -vn 0.001404 -0.055635 0.998444 -vn -0.001404 -0.055635 0.998444 -vn -0.336283 -0.512833 0.789850 -vn 0.336283 -0.512833 0.789850 -vn -0.454543 -0.337077 0.824458 -vn 0.454543 -0.337077 0.824458 -vn -0.543474 -0.308603 0.780602 -vn 0.543474 -0.308603 0.780602 -vn -0.387158 -0.187811 0.902646 -vn 0.387158 -0.187811 0.902646 -vn -0.430647 -0.144902 0.890805 -vn 0.430647 -0.144902 0.890805 -vn -0.234016 -0.120548 0.964721 -vn 0.234016 -0.120548 0.964721 +vn 0 -0.888638 0.458571 +vn -0.937284 -0.25425 0.23835 +vn 0.937284 -0.25425 0.23835 +vn -0.430525 -0.89526 0.114597 +vn 0.430525 -0.89526 0.114597 +vn 0 -0.94644 0.322855 vn -0.263833 0.168798 0.949675 vn 0.263833 0.168798 0.949675 -vn 0.196722 0.141881 0.970122 -vn -0.196722 0.141881 0.970122 +vn 0 0.970214 0.242164 +vn 0.852718 0.504257 0.136204 +vn -0.852718 0.504257 0.136204 +vn 0.520371 0.770348 0.368389 +vn -0.520371 0.770348 0.368389 +vn -0.509171 0.852229 0.119999 +vn 0.509171 0.852229 0.119999 +vn -0.851985 0.219275 0.475387 +vn 0.851985 0.219275 0.475387 +vn -0.890988 -0.423261 -0.164037 +vn 0.890988 -0.423261 -0.164037 +vn -0.599231 -0.77398 0.204566 +vn 0.599231 -0.77398 0.204566 vn -0.906766 -0.008332 0.421522 vn -0.744133 -0.640919 0.188269 vn 0.744133 -0.640919 0.188269 @@ -1570,24 +959,24 @@ vn 0.639943 -0.761498 0.102786 vn -0.639943 -0.761498 0.102786 vn 0.955504 -0.011444 0.294717 vn -0.955504 -0.011444 0.294717 -vn 0.649678 0.754387 0.093570 -vn -0.649678 0.754387 0.093570 +vn 0.649678 0.754387 0.09357 +vn -0.649678 0.754387 0.09357 vn -0.037049 0.978881 0.200903 vn 0.037049 0.978881 0.200903 vn -0.752342 0.635395 0.173742 vn 0.752342 0.635395 0.173742 -vn -0.811792 -0.002777 0.583880 -vn -0.596942 0.486770 0.637684 -vn 0.596942 0.486770 0.637684 -vn 0.811792 -0.002777 0.583880 +vn -0.811792 -0.002777 0.58388 +vn -0.596942 0.48677 0.637684 +vn 0.596942 0.48677 0.637684 +vn 0.811792 -0.002777 0.58388 vn -0.868221 -0.005829 0.496109 vn -0.719504 0.473006 0.508469 vn 0.719504 0.473006 0.508469 vn 0.868221 -0.005829 0.496109 -vn -0.204260 0.828761 0.520951 +vn -0.20426 0.828761 0.520951 vn -0.095767 0.717277 0.690146 vn 0.095767 0.717277 0.690146 -vn 0.204260 0.828761 0.520951 +vn 0.20426 0.828761 0.520951 vn 0.451704 0.459883 0.764458 vn -0.451704 0.459883 0.764458 vn 0.450362 0.693899 0.561815 @@ -1608,973 +997,499 @@ vn -0.597949 -0.496475 0.629231 vn 0.597949 -0.496475 0.629231 vn -0.723197 -0.488907 0.487747 vn 0.723197 -0.488907 0.487747 -usemtl Material_ray.png -s 1 -f 61/1/1 65/2/2 49/3/3 -f 50/4/4 66/5/5 62/6/6 -f 63/7/7 65/2/2 61/1/1 -f 62/6/6 66/5/5 64/8/8 -f 61/1/1 59/9/9 63/7/7 -f 64/8/8 60/10/10 62/6/6 -f 61/1/1 57/11/11 59/9/9 -f 60/10/10 58/12/12 62/6/6 -f 61/1/1 55/13/13 57/11/11 -f 58/12/12 56/14/14 62/6/6 -f 61/1/1 53/15/15 55/13/13 -f 56/14/14 54/16/16 62/6/6 -f 61/1/1 51/17/17 53/15/15 -f 54/16/16 52/18/18 62/6/6 -f 61/1/1 49/3/3 51/17/17 -f 52/18/18 50/4/4 62/6/6 -f 225/19/19 229/20/20 227/21/21 -f 228/22/22 230/23/23 226/24/24 -f 73/25/25 284/26/26 74/27/27 -f 74/28/27 285/29/28 73/30/25 -f 342/31/29 348/32/30 384/33/31 -f 385/34/32 349/35/33 343/36/34 -f 300/37/35 346/38/36 344/39/37 -f 345/40/38 347/41/39 301/42/40 -f 324/43/41 380/44/42 352/45/43 -f 353/46/44 381/47/45 325/48/46 -f 442/49/47 444/50/48 446/51/49 -f 447/52/50 445/53/51 443/54/52 -f 464/55/53 492/56/54 466/57/55 -f 467/58/56 493/59/57 465/60/58 -f 496/61/59 498/62/60 500/63/61 -f 501/64/62 499/65/63 497/66/64 -f 505/67/65 323/68/66 321/69/67 -f 505/67/65 321/69/67 391/70/68 -f 320/71/69 322/72/70 504/73/71 -f 320/71/69 504/73/71 390/74/72 -f 505/67/65 507/75/73 315/76/74 -f 505/67/65 315/76/74 323/68/66 -f 314/77/75 506/78/76 504/73/71 -f 314/77/75 504/73/71 322/72/70 -f 389/79/77 383/80/78 507/75/73 -f 383/80/78 315/76/74 507/75/73 -f 314/77/75 382/81/79 506/78/76 -f 382/81/79 388/82/80 506/78/76 -f 501/64/62 497/66/64 495/83/81 -f 501/64/62 495/83/81 503/84/82 -f 494/85/83 496/61/59 500/63/61 -f 494/85/83 500/63/61 502/86/84 -f 505/67/65 503/84/82 507/75/73 -f 503/84/82 495/83/81 507/75/73 -f 494/85/83 502/86/84 506/78/76 -f 502/86/84 504/73/71 506/78/76 -f 495/83/81 401/87/85 507/75/73 -f 401/87/85 389/79/77 507/75/73 -f 388/82/80 400/88/86 506/78/76 -f 400/88/86 494/85/83 506/78/76 -f 497/66/64 399/89/87 495/83/81 -f 399/89/87 401/87/85 495/83/81 -f 400/88/86 398/90/88 494/85/83 -f 398/90/88 496/61/59 494/85/83 -f 499/65/63 397/91/89 497/66/64 -f 397/91/89 399/89/87 497/66/64 -f 398/90/88 396/92/90 496/61/59 -f 396/92/90 498/62/60 496/61/59 -f 501/64/62 395/93/91 499/65/63 -f 395/93/91 397/91/89 499/65/63 -f 396/92/90 394/94/92 498/62/60 -f 394/94/92 500/63/61 498/62/60 -f 503/84/82 393/95/93 395/93/91 -f 503/84/82 395/93/91 501/64/62 -f 394/94/92 392/96/94 502/86/84 -f 394/94/92 502/86/84 500/63/61 -f 505/67/65 391/70/68 393/95/93 -f 505/67/65 393/95/93 503/84/82 -f 392/96/94 390/74/72 504/73/71 -f 392/96/94 504/73/71 502/86/84 -f 491/97/95 493/59/57 467/58/56 -f 491/97/95 467/58/56 469/98/96 -f 466/57/55 492/56/54 490/99/97 -f 466/57/55 490/99/97 468/100/98 -f 489/101/99 491/97/95 471/102/100 -f 491/97/95 469/98/96 471/102/100 -f 468/100/98 490/99/97 470/103/101 -f 490/99/97 488/104/102 470/103/101 -f 483/105/103 489/101/99 473/106/104 -f 489/101/99 471/102/100 473/106/104 -f 470/103/101 488/104/102 472/107/105 -f 488/104/102 482/108/106 472/107/105 -f 481/109/107 483/105/103 473/106/104 -f 481/109/107 473/106/104 475/110/108 -f 472/107/105 482/108/106 480/111/109 -f 472/107/105 480/111/109 474/112/110 -f 481/109/107 475/110/108 457/113/111 -f 475/110/108 455/114/112 457/113/111 -f 454/115/113 474/112/110 456/116/114 -f 474/112/110 480/111/109 456/116/114 -f 463/117/115 479/118/116 459/119/117 -f 463/117/115 459/119/117 461/120/118 -f 458/121/119 478/122/120 462/123/121 -f 458/121/119 462/123/121 460/124/122 -f 479/118/116 463/117/115 485/125/123 -f 463/117/115 453/126/124 485/125/123 -f 452/127/125 462/123/121 484/128/126 -f 462/123/121 478/122/120 484/128/126 -f 487/129/127 485/125/123 477/130/128 -f 485/125/123 453/126/124 477/130/128 -f 452/127/125 484/128/126 476/131/129 -f 484/128/126 486/132/130 476/131/129 -f 487/129/127 477/130/128 465/60/58 -f 487/129/127 465/60/58 493/59/57 -f 464/55/53 476/131/129 486/132/130 -f 464/55/53 486/132/130 492/56/54 -f 491/97/95 489/101/99 493/59/57 -f 489/101/99 487/129/127 493/59/57 -f 486/132/130 488/104/102 492/56/54 -f 488/104/102 490/99/97 492/56/54 -f 489/101/99 483/105/103 485/125/123 -f 489/101/99 485/125/123 487/129/127 -f 484/128/126 482/108/106 488/104/102 -f 484/128/126 488/104/102 486/132/130 -f 483/105/103 481/109/107 485/125/123 -f 481/109/107 479/118/116 485/125/123 -f 478/122/120 480/111/109 484/128/126 -f 480/111/109 482/108/106 484/128/126 -f 481/109/107 457/113/111 479/118/116 -f 457/113/111 459/119/117 479/118/116 -f 458/121/119 456/116/114 478/122/120 -f 456/116/114 480/111/109 478/122/120 -f 473/106/104 421/133/131 475/110/108 -f 421/133/131 419/134/132 475/110/108 -f 418/135/133 420/136/134 474/112/110 -f 420/136/134 472/107/105 474/112/110 -f 471/102/100 423/137/135 473/106/104 -f 423/137/135 421/133/131 473/106/104 -f 420/136/134 422/138/136 472/107/105 -f 422/138/136 470/103/101 472/107/105 -f 469/98/96 425/139/137 471/102/100 -f 425/139/137 423/137/135 471/102/100 -f 422/138/136 424/140/138 470/103/101 -f 424/140/138 468/100/98 470/103/101 -f 467/58/56 427/141/139 425/139/137 -f 467/58/56 425/139/137 469/98/96 -f 424/140/138 426/142/140 466/57/55 -f 424/140/138 466/57/55 468/100/98 -f 465/60/58 429/143/141 427/141/139 -f 465/60/58 427/141/139 467/58/56 -f 426/142/140 428/144/142 464/55/53 -f 426/142/140 464/55/53 466/57/55 -f 477/130/128 417/145/143 429/143/141 -f 477/130/128 429/143/141 465/60/58 -f 428/144/142 416/146/144 476/131/129 -f 428/144/142 476/131/129 464/55/53 -f 475/110/108 419/134/132 441/147/145 -f 475/110/108 441/147/145 455/114/112 -f 440/148/146 418/135/133 474/112/110 -f 440/148/146 474/112/110 454/115/113 -f 455/114/112 441/147/145 439/149/147 -f 455/114/112 439/149/147 457/113/111 -f 438/150/148 440/148/146 454/115/113 -f 438/150/148 454/115/113 456/116/114 -f 457/113/111 439/149/147 459/119/117 -f 439/149/147 437/151/149 459/119/117 -f 436/152/150 438/150/148 458/121/119 -f 438/150/148 456/116/114 458/121/119 -f 459/119/117 437/151/149 461/120/118 -f 437/151/149 435/153/151 461/120/118 -f 434/154/152 436/152/150 460/124/122 -f 436/152/150 458/121/119 460/124/122 -f 461/120/118 435/153/151 433/155/153 -f 461/120/118 433/155/153 463/117/115 -f 432/156/154 434/154/152 460/124/122 -f 432/156/154 460/124/122 462/123/121 -f 463/117/115 433/155/153 453/126/124 -f 433/155/153 451/157/155 453/126/124 -f 450/158/156 432/156/154 452/127/125 -f 432/156/154 462/123/121 452/127/125 -f 453/126/124 451/157/155 417/145/143 -f 453/126/124 417/145/143 477/130/128 -f 416/146/144 450/158/156 452/127/125 -f 416/146/144 452/127/125 476/131/129 -f 447/52/50 443/54/52 449/159/157 -f 443/54/52 313/160/158 449/159/157 -f 312/161/159 442/49/47 448/162/160 -f 442/49/47 446/51/49 448/162/160 -f 431/163/161 449/159/157 383/80/78 -f 449/159/157 313/160/158 383/80/78 -f 312/161/159 448/162/160 382/164/79 -f 448/162/160 430/165/162 382/164/79 -f 451/157/155 431/163/161 417/145/143 -f 431/163/161 415/166/163 417/145/143 -f 414/167/164 430/165/162 416/146/144 -f 430/165/162 450/158/156 416/146/144 -f 433/155/153 449/159/157 451/157/155 -f 449/159/157 431/163/161 451/157/155 -f 430/165/162 448/162/160 450/158/156 -f 448/162/160 432/156/154 450/158/156 -f 447/52/50 449/159/157 435/153/151 -f 449/159/157 433/155/153 435/153/151 -f 432/156/154 448/162/160 434/154/152 -f 448/162/160 446/51/49 434/154/152 -f 439/149/147 447/52/50 435/153/151 -f 439/149/147 435/153/151 437/151/149 -f 434/154/152 446/51/49 438/150/148 -f 434/154/152 438/150/148 436/152/150 -f 445/53/51 447/52/50 441/147/145 -f 447/52/50 439/149/147 441/147/145 -f 438/150/148 446/51/49 440/148/146 -f 446/51/49 444/50/48 440/148/146 -f 441/147/145 419/134/132 413/168/165 -f 441/147/145 413/168/165 445/53/51 -f 412/169/166 418/135/133 440/148/146 -f 412/169/166 440/148/146 444/50/48 -f 415/166/163 431/163/161 383/80/78 -f 415/166/163 383/80/78 389/79/77 -f 382/164/79 430/165/162 414/167/164 -f 382/164/79 414/167/164 388/170/80 -f 443/171/52 319/172/167 311/173/168 -f 443/171/52 311/173/168 313/174/158 -f 310/175/169 318/176/170 442/177/47 -f 310/175/169 442/177/47 312/178/159 -f 413/168/165 391/179/68 445/53/51 -f 391/179/68 321/180/67 445/53/51 -f 320/181/69 390/182/72 444/50/48 -f 390/182/72 412/169/166 444/50/48 -f 445/53/51 321/180/67 443/54/52 -f 321/183/67 319/172/167 443/171/52 -f 318/176/170 320/184/69 442/177/47 -f 320/181/69 444/50/48 442/49/47 -f 417/145/143 415/166/163 403/185/171 -f 417/145/143 403/185/171 429/143/141 -f 402/186/172 414/167/164 416/146/144 -f 402/186/172 416/146/144 428/144/142 -f 427/141/139 429/143/141 405/187/173 -f 429/143/141 403/185/171 405/187/173 -f 402/186/172 428/144/142 404/188/174 -f 428/144/142 426/142/140 404/188/174 -f 425/139/137 427/141/139 407/189/175 -f 427/141/139 405/187/173 407/189/175 -f 404/188/174 426/142/140 406/190/176 -f 426/142/140 424/140/138 406/190/176 -f 423/137/135 425/139/137 409/191/177 -f 425/139/137 407/189/175 409/191/177 -f 406/190/176 424/140/138 408/192/178 -f 424/140/138 422/138/136 408/192/178 -f 421/133/131 423/137/135 409/191/177 -f 421/133/131 409/191/177 411/193/179 -f 408/192/178 422/138/136 420/136/134 -f 408/192/178 420/136/134 410/194/180 -f 419/134/132 421/133/131 411/193/179 -f 419/134/132 411/193/179 413/168/165 -f 410/194/180 420/136/134 418/135/133 -f 410/194/180 418/135/133 412/169/166 -f 413/168/165 411/193/179 393/195/93 -f 413/168/165 393/195/93 391/179/68 -f 392/196/94 410/194/180 412/169/166 -f 392/196/94 412/169/166 390/182/72 -f 411/193/179 409/191/177 393/195/93 -f 409/191/177 395/197/91 393/195/93 -f 394/198/92 408/192/178 392/196/94 -f 408/192/178 410/194/180 392/196/94 -f 409/191/177 407/189/175 395/197/91 -f 407/189/175 397/199/89 395/197/91 -f 396/200/90 406/190/176 394/198/92 -f 406/190/176 408/192/178 394/198/92 -f 407/189/175 405/187/173 397/199/89 -f 405/187/173 399/89/87 397/199/89 -f 398/201/88 404/188/174 396/200/90 -f 404/188/174 406/190/176 396/200/90 -f 405/187/173 403/185/171 401/87/85 -f 405/187/173 401/87/85 399/89/87 -f 400/202/86 402/186/172 404/188/174 -f 400/202/86 404/188/174 398/201/88 -f 415/166/163 389/79/77 403/185/171 -f 389/79/77 401/87/85 403/185/171 -f 400/202/86 388/170/80 402/186/172 -f 388/170/80 414/167/164 402/186/172 -f 381/47/45 353/46/44 387/203/181 -f 353/46/44 351/204/182 387/203/181 -f 350/205/183 352/45/43 386/206/184 -f 352/45/43 380/44/42 386/206/184 -f 381/47/45 387/203/181 323/207/66 -f 387/203/181 321/183/67 323/207/66 -f 320/184/69 386/206/184 322/208/70 -f 386/206/184 380/44/42 322/208/70 -f 381/47/45 379/209/185 325/48/46 -f 379/209/185 317/210/186 325/48/46 -f 316/211/187 378/212/188 324/43/41 -f 378/212/188 380/44/42 324/43/41 -f 381/47/45 323/207/66 379/209/185 -f 323/207/66 315/213/74 379/209/185 -f 314/214/75 322/208/70 378/212/188 -f 322/208/70 380/44/42 378/212/188 -f 343/36/34 345/40/38 301/42/40 -f 343/36/34 301/42/40 385/34/32 -f 300/37/35 344/39/37 342/31/29 -f 300/37/35 342/31/29 384/33/31 -f 385/34/32 301/42/40 299/215/189 -f 385/34/32 299/215/189 319/172/167 -f 298/216/190 300/37/35 384/33/31 -f 298/216/190 384/33/31 318/176/170 -f 387/203/181 385/34/32 321/183/67 -f 385/34/32 319/172/167 321/183/67 -f 318/176/170 384/33/31 320/184/69 -f 384/33/31 386/206/184 320/184/69 -f 387/203/181 351/204/182 385/34/32 -f 351/204/182 349/35/33 385/34/32 -f 348/32/30 350/205/183 384/33/31 -f 350/205/183 386/206/184 384/33/31 -f 371/217/191 377/218/192 383/219/78 -f 377/218/192 315/213/74 383/219/78 -f 314/214/75 376/220/193 382/221/79 -f 376/220/193 370/222/194 382/221/79 -f 371/217/191 383/219/78 313/174/158 -f 371/217/191 313/174/158 369/223/195 -f 312/178/159 382/221/79 370/222/194 -f 312/178/159 370/222/194 368/224/196 -f 369/223/195 313/174/158 311/173/168 -f 369/223/195 311/173/168 363/225/197 -f 310/175/169 312/178/159 368/224/196 -f 310/175/169 368/224/196 362/226/198 -f 311/173/168 297/227/199 363/225/197 -f 297/227/199 295/228/200 363/225/197 -f 294/229/201 296/230/202 362/226/198 -f 296/230/202 310/175/169 362/226/198 -f 361/231/203 291/232/204 285/29/28 -f 361/231/203 285/29/28 74/28/27 -f 284/26/26 290/233/205 360/234/206 -f 284/26/26 360/234/206 74/27/27 -f 289/235/207 287/236/208 291/232/204 -f 287/236/208 285/29/28 291/232/204 -f 284/26/26 286/237/209 290/233/205 -f 286/237/209 288/238/210 290/233/205 -f 359/239/211 361/231/203 302/240/212 -f 361/231/203 74/28/27 302/240/212 -f 74/27/27 360/234/206 302/241/212 -f 360/234/206 358/242/213 302/241/212 -f 365/243/214 293/244/215 361/231/203 -f 293/244/215 291/232/204 361/231/203 -f 290/233/205 292/245/216 360/234/206 -f 292/245/216 364/246/217 360/234/206 -f 365/243/214 361/231/203 359/239/211 -f 365/243/214 359/239/211 367/247/218 -f 358/242/213 360/234/206 364/246/217 -f 358/242/213 364/246/217 366/248/219 -f 367/247/218 359/239/211 357/249/220 -f 367/247/218 357/249/220 373/250/221 -f 356/251/222 358/242/213 366/248/219 -f 356/251/222 366/248/219 372/252/223 -f 373/250/221 357/249/220 355/253/224 -f 373/250/221 355/253/224 375/254/225 -f 354/255/226 356/251/222 372/252/223 -f 354/255/226 372/252/223 374/256/227 -f 375/254/225 355/253/224 317/210/186 -f 375/254/225 317/210/186 379/209/185 -f 316/211/187 354/255/226 374/256/227 -f 316/211/187 374/256/227 378/212/188 -f 375/254/225 379/209/185 377/218/192 -f 379/209/185 315/213/74 377/218/192 -f 314/214/75 378/212/188 376/220/193 -f 378/212/188 374/256/227 376/220/193 -f 377/218/192 371/217/191 373/250/221 -f 377/218/192 373/250/221 375/254/225 -f 372/252/223 370/222/194 376/220/193 -f 372/252/223 376/220/193 374/256/227 -f 371/217/191 369/223/195 367/247/218 -f 371/217/191 367/247/218 373/250/221 -f 366/248/219 368/224/196 370/222/194 -f 366/248/219 370/222/194 372/252/223 -f 369/223/195 363/225/197 365/243/214 -f 369/223/195 365/243/214 367/247/218 -f 364/246/217 362/226/198 368/224/196 -f 364/246/217 368/224/196 366/248/219 -f 363/225/197 295/228/200 293/244/215 -f 363/225/197 293/244/215 365/243/214 -f 292/245/216 294/229/201 362/226/198 -f 292/245/216 362/226/198 364/246/217 -f 317/210/186 355/253/224 75/257/228 -f 317/210/186 75/257/228 76/258/229 -f 75/259/228 354/255/226 316/211/187 -f 75/259/228 316/211/187 76/260/229 -f 355/253/224 357/249/220 303/261/230 -f 355/253/224 303/261/230 75/257/228 -f 303/262/230 356/251/222 354/255/226 -f 303/262/230 354/255/226 75/259/228 -f 357/249/220 359/239/211 303/261/230 -f 359/239/211 302/240/212 303/261/230 -f 302/241/212 358/242/213 303/262/230 -f 358/242/213 356/251/222 303/262/230 -f 325/48/46 317/210/186 77/263/231 -f 317/210/186 76/258/229 77/263/231 -f 76/260/229 316/211/187 77/264/231 -f 316/211/187 324/43/41 77/264/231 -f 319/172/167 299/215/189 297/227/199 -f 319/172/167 297/227/199 311/173/168 -f 296/230/202 298/216/190 318/176/170 -f 296/230/202 318/176/170 310/175/169 -f 349/35/33 329/265/232 343/36/34 -f 329/265/232 327/266/233 343/36/34 -f 326/267/234 328/268/235 342/31/29 -f 328/268/235 348/32/30 342/31/29 -f 329/265/232 349/35/33 305/269/236 -f 329/265/232 305/269/236 309/270/237 -f 305/271/236 348/32/30 328/268/235 -f 305/271/236 328/268/235 309/272/237 -f 349/35/33 351/204/182 78/273/238 -f 349/35/33 78/273/238 305/269/236 -f 78/274/238 350/205/183 348/32/30 -f 78/274/238 348/32/30 305/271/236 -f 351/204/182 353/46/44 78/273/238 -f 353/46/44 304/275/239 78/273/238 -f 304/276/239 352/45/43 78/274/238 -f 352/45/43 350/205/183 78/274/238 -f 353/46/44 325/48/46 304/275/239 -f 325/48/46 77/263/231 304/275/239 -f 77/264/231 324/43/41 304/276/239 -f 324/43/41 352/45/43 304/276/239 -f 301/42/40 347/41/39 93/277/240 -f 347/278/39 80/279/241 93/280/240 -f 79/281/242 346/282/36 92/283/243 -f 346/38/36 300/37/35 92/284/243 -f 345/40/38 216/285/244 347/41/39 -f 216/286/244 80/279/241 347/278/39 -f 79/281/242 215/287/245 346/282/36 -f 215/288/245 344/39/37 346/38/36 -f 343/36/34 327/266/233 210/289/246 -f 327/266/233 82/290/247 210/289/246 -f 81/291/248 326/267/234 209/292/249 -f 326/267/234 342/31/29 209/292/249 -f 345/40/38 343/36/34 216/285/244 -f 343/36/34 210/289/246 216/285/244 -f 209/292/249 342/31/29 215/288/245 -f 342/31/29 344/39/37 215/288/245 -f 333/293/250 84/294/251 82/290/247 -f 333/293/250 82/290/247 327/266/233 -f 81/291/248 83/295/252 332/296/253 -f 81/291/248 332/296/253 326/267/234 -f 339/297/254 333/293/250 329/265/232 -f 333/293/250 327/266/233 329/265/232 -f 326/267/234 332/296/253 328/268/235 -f 332/296/253 338/298/255 328/268/235 -f 341/299/256 335/300/257 337/301/258 -f 335/300/257 331/302/259 337/301/258 -f 330/303/260 334/304/261 336/305/262 -f 334/304/261 340/306/263 336/305/262 -f 339/297/254 337/301/258 331/302/259 -f 339/297/254 331/302/259 333/293/250 -f 330/303/260 336/305/262 338/298/255 -f 330/303/260 338/298/255 332/296/253 -f 331/302/259 86/307/264 84/294/251 -f 331/302/259 84/294/251 333/293/250 -f 83/295/252 85/308/265 330/303/260 -f 83/295/252 330/303/260 332/296/253 -f 335/300/257 88/309/266 86/307/264 -f 335/300/257 86/307/264 331/302/259 -f 85/308/265 87/310/267 334/304/261 -f 85/308/265 334/304/261 330/303/260 -f 341/299/256 90/311/268 88/309/266 -f 341/299/256 88/309/266 335/300/257 -f 87/310/267 89/312/269 340/306/263 -f 87/310/267 340/306/263 334/304/261 -f 306/313/270 91/314/271 90/311/268 -f 306/313/270 90/311/268 341/299/256 -f 89/312/269 91/315/271 306/316/270 -f 89/312/269 306/316/270 340/306/263 -f 337/301/258 307/317/272 341/299/256 -f 307/317/272 306/313/270 341/299/256 -f 306/316/270 307/318/272 340/306/263 -f 307/318/272 336/305/262 340/306/263 -f 339/297/254 308/319/273 337/301/258 -f 308/319/273 307/317/272 337/301/258 -f 307/318/272 308/320/273 336/305/262 -f 308/320/273 338/298/255 336/305/262 -f 329/265/232 309/270/237 339/297/254 -f 309/270/237 308/319/273 339/297/254 -f 308/320/273 309/272/237 338/298/255 -f 309/272/237 328/268/235 338/298/255 -f 301/42/40 93/277/240 95/321/274 -f 301/42/40 95/321/274 299/215/189 -f 94/322/275 92/284/243 300/37/35 -f 94/322/275 300/37/35 298/216/190 -f 299/215/189 95/321/274 97/323/276 -f 299/215/189 97/323/276 297/227/199 -f 96/324/277 94/322/275 298/216/190 -f 96/324/277 298/216/190 296/230/202 -f 297/227/199 97/323/276 295/228/200 -f 97/323/276 99/325/278 295/228/200 -f 98/326/279 96/324/277 294/229/201 -f 96/324/277 296/230/202 294/229/201 -f 295/228/200 99/325/278 101/327/280 -f 295/228/200 101/327/280 293/244/215 -f 100/328/281 98/326/279 294/229/201 -f 100/328/281 294/229/201 292/245/216 -f 293/244/215 101/327/280 291/232/204 -f 101/327/280 103/329/282 291/232/204 -f 102/330/283 100/328/281 290/233/205 -f 100/328/281 292/245/216 290/233/205 -f 291/232/204 103/329/282 289/235/207 -f 103/329/282 105/331/284 289/235/207 -f 104/332/285 102/330/283 288/238/210 -f 102/330/283 290/233/205 288/238/210 -f 289/235/207 105/331/284 287/236/208 -f 105/331/284 107/333/286 287/236/208 -f 106/334/287 104/332/285 286/237/209 -f 104/332/285 288/238/210 286/237/209 -f 287/236/208 107/333/286 109/335/288 -f 287/236/208 109/335/288 285/29/28 -f 108/336/289 106/334/287 286/237/209 -f 108/336/289 286/237/209 284/26/26 -f 285/29/28 109/335/288 67/337/290 -f 285/29/28 67/337/290 73/30/25 -f 67/338/290 108/336/289 284/26/26 -f 67/338/290 284/26/26 73/25/25 -f 281/339/291 235/340/292 233/341/293 -f 281/339/291 233/341/293 283/342/294 -f 232/343/295 234/344/296 280/345/297 -f 232/343/295 280/345/297 282/346/298 -f 283/342/294 233/341/293 255/347/299 -f 283/342/294 255/347/299 261/348/300 -f 254/349/301 232/343/295 282/346/298 -f 254/349/301 282/346/298 260/350/302 -f 261/348/300 255/347/299 257/351/303 -f 261/348/300 257/351/303 259/352/304 -f 256/353/305 254/349/301 260/350/302 -f 256/353/305 260/350/302 258/354/306 -f 263/355/307 253/356/308 235/340/292 -f 263/355/307 235/340/292 281/339/291 -f 234/344/296 252/357/309 262/358/310 -f 234/344/296 262/358/310 280/345/297 -f 265/359/311 251/360/312 263/355/307 -f 251/360/312 253/356/308 263/355/307 -f 252/357/309 250/361/313 262/358/310 -f 250/361/313 264/362/314 262/358/310 -f 267/363/315 249/364/316 265/359/311 -f 249/364/316 251/360/312 265/359/311 -f 250/361/313 248/365/317 264/362/314 -f 248/365/317 266/366/318 264/362/314 -f 269/367/319 247/368/320 249/364/316 -f 269/367/319 249/364/316 267/363/315 -f 248/365/317 246/369/321 268/370/322 -f 248/365/317 268/370/322 266/366/318 -f 271/371/323 245/372/324 269/367/319 -f 245/372/324 247/368/320 269/367/319 -f 246/369/321 244/373/325 268/370/322 -f 244/373/325 270/374/326 268/370/322 -f 273/375/327 243/376/328 245/372/324 -f 273/375/327 245/372/324 271/371/323 -f 244/373/325 242/377/329 272/378/330 -f 244/373/325 272/378/330 270/374/326 -f 275/379/331 241/380/332 273/375/327 -f 241/380/332 243/376/328 273/375/327 -f 242/377/329 240/381/333 272/378/330 -f 240/381/333 274/382/334 272/378/330 -f 279/383/335 237/384/336 275/379/331 -f 237/384/336 241/380/332 275/379/331 -f 240/381/333 236/385/337 274/382/334 -f 236/385/337 278/386/338 274/382/334 -f 277/387/339 239/388/340 237/384/336 -f 277/387/339 237/384/336 279/383/335 -f 236/385/337 238/389/341 276/390/342 -f 236/385/337 276/390/342 278/386/338 -f 259/352/304 257/351/303 239/388/340 -f 259/352/304 239/388/340 277/387/339 -f 238/389/341 256/353/305 258/354/306 -f 238/389/341 258/354/306 276/390/342 -f 257/351/303 111/391/343 129/392/344 -f 257/351/303 129/392/344 239/388/340 -f 128/393/345 110/394/346 256/353/305 -f 128/393/345 256/353/305 238/389/341 -f 239/388/340 129/392/344 180/395/347 -f 239/388/340 180/395/347 237/384/336 -f 179/396/348 128/393/345 238/389/341 -f 179/396/348 238/389/341 236/385/337 -f 237/384/336 180/395/347 127/397/349 -f 237/384/336 127/397/349 241/380/332 -f 126/398/350 179/396/348 236/385/337 -f 126/398/350 236/385/337 240/381/333 -f 241/380/332 127/397/349 243/376/328 -f 127/397/349 125/399/351 243/376/328 -f 124/400/352 126/398/350 242/377/329 -f 126/398/350 240/381/333 242/377/329 -f 243/376/328 125/399/351 245/372/324 -f 125/399/351 123/401/353 245/372/324 -f 122/402/354 124/400/352 244/373/325 -f 124/400/352 242/377/329 244/373/325 -f 245/372/324 123/401/353 121/403/355 -f 245/372/324 121/403/355 247/368/320 -f 120/404/356 122/402/354 244/373/325 -f 120/404/356 244/373/325 246/369/321 -f 247/368/320 121/403/355 119/405/357 -f 247/368/320 119/405/357 249/364/316 -f 118/406/358 120/404/356 246/369/321 -f 118/406/358 246/369/321 248/365/317 -f 249/364/316 119/405/357 117/407/359 -f 249/364/316 117/407/359 251/360/312 -f 116/408/360 118/406/358 248/365/317 -f 116/408/360 248/365/317 250/361/313 -f 251/360/312 117/407/359 115/409/361 -f 251/360/312 115/409/361 253/356/308 -f 114/410/362 116/408/360 250/361/313 -f 114/410/362 250/361/313 252/357/309 -f 253/356/308 115/409/361 235/340/292 -f 115/409/361 182/411/363 235/340/292 -f 181/412/364 114/410/362 234/344/296 -f 114/410/362 252/357/309 234/344/296 -f 255/347/299 113/413/365 257/351/303 -f 113/413/365 111/391/343 257/351/303 -f 110/394/346 112/414/366 256/353/305 -f 112/414/366 254/349/301 256/353/305 -f 233/341/293 184/415/367 113/413/365 -f 233/341/293 113/413/365 255/347/299 -f 112/414/366 183/416/368 232/343/295 -f 112/414/366 232/343/295 254/349/301 -f 235/340/292 182/411/363 184/415/367 -f 235/340/292 184/415/367 233/341/293 -f 183/416/368 181/412/364 234/344/296 -f 183/416/368 234/344/296 232/343/295 -f 230/23/23 231/417/369 224/418/370 -f 230/23/23 224/418/370 226/24/24 -f 224/418/370 231/417/369 229/20/20 -f 224/418/370 229/20/20 225/19/19 -f 224/418/370 72/419/371 226/24/24 -f 72/419/371 223/420/372 226/24/24 -f 222/421/373 72/419/371 225/19/19 -f 72/419/371 224/418/370 225/19/19 -f 226/24/24 223/420/372 221/422/374 -f 226/24/24 221/422/374 228/22/22 -f 220/423/375 222/421/373 225/19/19 -f 220/423/375 225/19/19 227/21/21 -f 228/22/22 221/422/374 219/424/376 -f 228/22/22 219/424/376 230/23/23 -f 218/425/377 220/423/375 227/21/21 -f 218/425/377 227/21/21 229/20/20 -f 230/23/23 219/424/376 231/417/369 -f 219/424/376 217/426/378 231/417/369 -f 217/426/378 218/425/377 231/417/369 -f 218/425/377 229/20/20 231/417/369 -f 219/424/376 136/427/379 137/428/380 -f 219/424/376 137/428/380 217/426/378 -f 137/428/380 135/429/381 218/425/377 -f 137/428/380 218/425/377 217/426/378 -f 221/422/374 134/430/382 136/427/379 -f 221/422/374 136/427/379 219/424/376 -f 135/429/381 133/431/383 220/423/375 -f 135/429/381 220/423/375 218/425/377 -f 223/420/372 132/432/384 134/430/382 -f 223/420/372 134/430/382 221/422/374 -f 133/431/383 131/433/385 222/421/373 -f 133/431/383 222/421/373 220/423/375 -f 72/419/371 130/434/386 223/420/372 -f 130/434/386 132/432/384 223/420/372 -f 131/433/385 130/434/386 222/421/373 -f 130/434/386 72/419/371 222/421/373 -f 212/435/387 165/436/388 80/279/241 -f 212/435/387 80/279/241 216/286/244 -f 79/281/242 164/437/389 211/438/390 -f 79/281/242 211/438/390 215/287/245 -f 212/435/387 216/286/244 214/439/391 -f 216/286/244 210/440/246 214/439/391 -f 209/441/249 215/287/245 213/442/392 -f 215/287/245 211/438/390 213/442/392 -f 214/439/391 210/440/246 167/443/393 -f 210/440/246 82/444/247 167/443/393 -f 81/445/248 209/441/249 166/446/394 -f 209/441/249 213/442/392 166/446/394 -f 167/443/393 188/447/395 214/439/391 -f 188/447/395 145/448/396 214/439/391 -f 144/449/397 187/450/398 213/442/392 -f 187/450/398 166/446/394 213/442/392 -f 214/439/391 145/448/396 212/435/387 -f 145/448/396 143/451/399 212/435/387 -f 142/452/400 144/449/397 211/438/390 -f 144/449/397 213/442/392 211/438/390 -f 212/435/387 143/451/399 141/453/401 -f 212/435/387 141/453/401 165/436/388 -f 140/454/402 142/452/400 211/438/390 -f 140/454/402 211/438/390 164/437/389 -f 165/436/388 141/453/401 139/455/403 -f 165/436/388 139/455/403 177/456/404 -f 139/455/403 140/454/402 164/437/389 -f 139/455/403 164/437/389 177/456/404 -f 207/457/405 208/458/406 199/459/407 -f 207/457/405 199/459/407 205/460/408 -f 199/459/407 208/458/406 206/461/409 -f 199/459/407 206/461/409 204/462/410 -f 203/463/411 205/460/408 201/464/412 -f 205/460/408 199/459/407 201/464/412 -f 199/459/407 204/462/410 200/465/413 -f 204/462/410 202/466/414 200/465/413 -f 207/457/405 205/460/408 194/467/415 -f 207/457/405 194/467/415 192/468/416 -f 193/469/417 204/462/410 206/461/409 -f 193/469/417 206/461/409 191/470/418 -f 205/460/408 203/463/411 194/467/415 -f 203/463/411 196/471/419 194/467/415 -f 195/472/420 202/466/414 193/469/417 -f 202/466/414 204/462/410 193/469/417 -f 203/463/411 201/464/412 198/473/421 -f 203/463/411 198/473/421 196/471/419 -f 197/474/422 200/465/413 202/466/414 -f 197/474/422 202/466/414 195/472/420 -f 201/464/412 199/459/407 71/475/423 -f 201/464/412 71/475/423 198/473/421 -f 71/475/423 199/459/407 200/465/413 -f 71/475/423 200/465/413 197/474/422 -f 207/457/405 192/468/416 208/458/406 -f 192/468/416 70/476/424 208/458/406 -f 70/476/424 191/470/418 208/458/406 -f 191/470/418 206/461/409 208/458/406 -f 192/468/416 145/448/396 70/476/424 -f 145/448/396 190/477/425 70/476/424 -f 190/477/425 144/449/397 70/476/424 -f 144/449/397 191/470/418 70/476/424 -f 198/473/421 71/475/423 139/455/403 -f 71/478/423 138/479/426 139/480/403 -f 138/481/426 71/482/423 139/483/403 -f 71/475/423 197/474/422 139/455/403 -f 196/471/419 198/473/421 141/453/401 -f 198/473/421 139/455/403 141/453/401 -f 139/455/403 197/474/422 140/454/402 -f 197/474/422 195/472/420 140/454/402 -f 194/467/415 196/471/419 143/451/399 -f 196/471/419 141/453/401 143/451/399 -f 140/454/402 195/472/420 142/452/400 -f 195/472/420 193/469/417 142/452/400 -f 192/468/416 194/467/415 143/451/399 -f 192/468/416 143/451/399 145/448/396 -f 142/452/400 193/469/417 191/470/418 -f 142/452/400 191/470/418 144/449/397 -f 186/484/427 132/432/384 69/485/428 -f 132/432/384 130/434/386 69/485/428 -f 130/434/386 131/433/385 69/485/428 -f 131/433/385 185/486/429 69/485/428 -f 189/487/430 188/447/395 69/485/428 -f 188/447/395 186/484/427 69/485/428 -f 185/486/429 187/450/398 69/485/428 -f 187/450/398 189/487/430 69/485/428 -f 189/487/430 190/477/425 188/447/395 -f 190/477/425 145/448/396 188/447/395 -f 144/449/397 190/477/425 187/450/398 -f 190/477/425 189/487/430 187/450/398 -f 169/488/431 171/489/432 132/432/384 -f 169/488/431 132/432/384 186/484/427 -f 131/433/385 170/490/433 168/491/434 -f 131/433/385 168/491/434 185/486/429 -f 186/484/427 188/447/395 167/443/393 -f 186/484/427 167/443/393 169/488/431 -f 166/446/394 187/450/398 185/486/429 -f 166/446/394 185/486/429 168/491/434 -f 173/492/435 134/430/382 171/489/432 -f 134/430/382 132/432/384 171/489/432 -f 131/433/385 133/431/383 170/490/433 -f 133/431/383 172/493/436 170/490/433 -f 175/494/437 136/427/379 134/430/382 -f 175/494/437 134/430/382 173/492/435 -f 133/431/383 135/429/381 174/495/438 -f 133/431/383 174/495/438 172/493/436 -f 176/496/439 137/428/380 136/427/379 -f 176/496/439 136/427/379 175/494/437 -f 135/429/381 137/428/380 176/496/439 -f 135/429/381 176/496/439 174/495/438 -f 184/415/367 182/411/363 178/497/440 -f 182/411/363 177/456/404 178/497/440 -f 177/456/404 181/412/364 178/497/440 -f 181/412/364 183/416/368 178/497/440 -f 178/497/440 68/498/441 113/413/365 -f 178/497/440 113/413/365 184/415/367 -f 112/414/366 68/498/441 178/497/440 -f 112/414/366 178/497/440 183/416/368 -f 68/498/441 163/499/442 113/413/365 -f 163/499/442 111/391/343 113/413/365 -f 110/394/346 162/500/443 112/414/366 -f 162/500/443 68/498/441 112/414/366 -f 177/456/404 182/411/363 115/409/361 -f 177/456/404 115/409/361 165/436/388 -f 114/410/362 181/412/364 177/456/404 -f 114/410/362 177/456/404 164/437/389 -f 147/501/444 165/436/388 115/409/361 -f 147/501/444 115/409/361 117/407/359 -f 114/410/362 164/437/389 146/502/445 -f 114/410/362 146/502/445 116/408/360 -f 149/503/446 147/501/444 119/405/357 -f 147/501/444 117/407/359 119/405/357 -f 116/408/360 146/502/445 118/406/358 -f 146/502/445 148/504/447 118/406/358 -f 151/505/448 149/503/446 121/403/355 -f 149/503/446 119/405/357 121/403/355 -f 118/406/358 148/504/447 120/404/356 -f 148/504/447 150/506/449 120/404/356 -f 153/507/450 151/505/448 123/401/353 -f 151/505/448 121/403/355 123/401/353 -f 120/404/356 150/506/449 122/402/354 -f 150/506/449 152/508/451 122/402/354 -f 155/509/452 153/507/450 125/399/351 -f 153/507/450 123/401/353 125/399/351 -f 122/402/354 152/508/451 124/400/352 -f 152/508/451 154/510/453 124/400/352 -f 157/511/454 155/509/452 127/397/349 -f 155/509/452 125/399/351 127/397/349 -f 124/400/352 154/510/453 126/398/350 -f 154/510/453 156/512/455 126/398/350 -f 159/513/456 157/511/454 180/395/347 -f 157/511/454 127/397/349 180/395/347 -f 126/398/350 156/512/455 179/396/348 -f 156/512/455 158/514/457 179/396/348 -f 159/513/456 180/395/347 129/392/344 -f 159/513/456 129/392/344 161/515/458 -f 128/393/345 179/396/348 158/514/457 -f 128/393/345 158/514/457 160/516/459 -f 161/515/458 129/392/344 163/499/442 -f 129/392/344 111/391/343 163/499/442 -f 110/394/346 128/393/345 162/500/443 -f 128/393/345 160/516/459 162/500/443 -f 68/498/441 67/517/290 163/499/442 -f 67/517/290 109/518/288 163/499/442 -f 108/519/289 67/517/290 162/500/443 -f 67/517/290 68/498/441 162/500/443 -f 163/499/442 109/518/288 161/515/458 -f 109/518/288 107/520/286 161/515/458 -f 106/521/287 108/519/289 160/516/459 -f 108/519/289 162/500/443 160/516/459 -f 161/515/458 107/520/286 159/513/456 -f 107/520/286 105/522/284 159/513/456 -f 104/523/285 106/521/287 158/514/457 -f 106/521/287 160/516/459 158/514/457 -f 159/513/456 105/522/284 103/524/282 -f 159/513/456 103/524/282 157/511/454 -f 102/525/283 104/523/285 158/514/457 -f 102/525/283 158/514/457 156/512/455 -f 157/511/454 103/524/282 155/509/452 -f 103/524/282 101/526/280 155/509/452 -f 100/527/281 102/525/283 154/510/453 -f 102/525/283 156/512/455 154/510/453 -f 155/509/452 101/526/280 153/507/450 -f 101/526/280 99/528/278 153/507/450 -f 98/529/279 100/527/281 152/508/451 -f 100/527/281 154/510/453 152/508/451 -f 153/507/450 99/528/278 151/505/448 -f 99/528/278 97/530/276 151/505/448 -f 96/531/277 98/529/279 150/506/449 -f 98/529/279 152/508/451 150/506/449 -f 151/505/448 97/530/276 95/532/274 -f 151/505/448 95/532/274 149/503/446 -f 94/533/275 96/531/277 150/506/449 -f 94/533/275 150/506/449 148/504/447 -f 149/503/446 95/532/274 147/501/444 -f 95/532/274 93/280/240 147/501/444 -f 92/283/243 94/533/275 146/502/445 -f 94/533/275 148/504/447 146/502/445 -f 147/501/444 93/280/240 80/279/241 -f 147/501/444 80/279/241 165/436/388 -f 79/281/242 92/283/243 146/502/445 -f 79/281/242 146/502/445 164/437/389 -f 169/488/431 167/443/393 82/444/247 -f 169/488/431 82/444/247 84/534/251 -f 81/445/248 166/446/394 168/491/434 -f 81/445/248 168/491/434 83/535/252 -f 171/489/432 169/488/431 84/534/251 -f 171/489/432 84/534/251 86/536/264 -f 83/535/252 168/491/434 170/490/433 -f 83/535/252 170/490/433 85/537/265 -f 173/492/435 171/489/432 86/536/264 -f 173/492/435 86/536/264 88/538/266 -f 85/537/265 170/490/433 172/493/436 -f 85/537/265 172/493/436 87/539/267 -f 175/494/437 173/492/435 90/540/268 -f 173/492/435 88/538/266 90/540/268 -f 87/539/267 172/493/436 89/541/269 -f 172/493/436 174/495/438 89/541/269 -f 176/496/439 175/494/437 91/542/271 -f 175/494/437 90/540/268 91/542/271 -f 89/541/269 174/495/438 91/542/271 -f 174/495/438 176/496/439 91/542/271 -f 50/4/4 48/543/460 2/544/461 -f 50/4/4 2/544/461 66/5/5 -f 1/545/462 47/546/463 49/3/3 -f 1/545/462 49/3/3 65/2/2 -f 66/5/5 2/544/461 12/547/464 -f 66/5/5 12/547/464 64/8/8 -f 11/548/465 1/545/462 65/2/2 -f 11/548/465 65/2/2 63/7/7 -f 64/8/8 12/547/464 14/549/466 -f 64/8/8 14/549/466 60/10/10 -f 13/550/467 11/548/465 63/7/7 -f 13/550/467 63/7/7 59/9/9 -f 60/10/10 14/549/466 24/551/468 -f 60/10/10 24/551/468 58/12/12 -f 23/552/469 13/550/467 59/9/9 -f 23/552/469 59/9/9 57/11/11 -f 58/12/12 24/551/468 56/14/14 -f 24/551/468 26/553/470 56/14/14 -f 25/554/471 23/552/469 55/13/13 -f 23/552/469 57/11/11 55/13/13 -f 56/14/14 26/553/470 54/16/16 -f 26/553/470 36/555/472 54/16/16 -f 35/556/473 25/554/471 53/15/15 -f 25/554/471 55/13/13 53/15/15 -f 54/16/16 36/555/472 52/18/18 -f 36/555/472 38/557/474 52/18/18 -f 37/558/475 35/556/473 51/17/17 -f 35/556/473 53/15/15 51/17/17 -f 52/18/18 38/557/474 50/4/4 -f 38/557/474 48/543/460 50/4/4 -f 47/546/463 37/558/475 49/3/3 -f 37/558/475 51/17/17 49/3/3 -f 46/559/476 48/543/460 40/560/477 -f 48/543/460 38/557/474 40/560/477 -f 37/558/475 47/546/463 39/561/478 -f 47/546/463 45/562/479 39/561/478 -f 44/563/480 46/559/476 42/564/481 -f 46/559/476 40/560/477 42/564/481 -f 39/561/478 45/562/479 41/565/482 -f 45/562/479 43/566/483 41/565/482 -f 42/564/481 40/560/477 32/567/484 -f 40/560/477 34/568/485 32/567/484 -f 33/569/486 39/561/478 31/570/487 -f 39/561/478 41/565/482 31/570/487 -f 40/560/477 38/557/474 34/568/485 -f 38/557/474 36/555/472 34/568/485 -f 35/556/473 37/558/475 33/569/486 -f 37/558/475 39/561/478 33/569/486 -f 34/568/485 36/555/472 28/571/488 -f 36/555/472 26/553/470 28/571/488 -f 25/554/471 35/556/473 27/572/489 -f 35/556/473 33/569/486 27/572/489 -f 32/567/484 34/568/485 30/573/490 -f 34/568/485 28/571/488 30/573/490 -f 27/572/489 33/569/486 29/574/491 -f 33/569/486 31/570/487 29/574/491 -f 30/573/490 28/571/488 20/575/492 -f 28/571/488 22/576/493 20/575/492 -f 21/577/494 27/572/489 19/578/495 -f 27/572/489 29/574/491 19/578/495 -f 28/571/488 26/553/470 24/551/468 -f 28/571/488 24/551/468 22/576/493 -f 23/552/469 25/554/471 27/572/489 -f 23/552/469 27/572/489 21/577/494 -f 22/576/493 24/551/468 16/579/496 -f 24/551/468 14/549/466 16/579/496 -f 13/550/467 23/552/469 15/580/497 -f 23/552/469 21/577/494 15/580/497 -f 20/575/492 22/576/493 18/581/498 -f 22/576/493 16/579/496 18/581/498 -f 15/580/497 21/577/494 17/582/499 -f 21/577/494 19/578/495 17/582/499 -f 18/581/498 16/579/496 10/583/500 -f 18/581/498 10/583/500 8/584/501 -f 9/585/502 15/580/497 17/582/499 -f 9/585/502 17/582/499 7/586/503 -f 16/579/496 14/549/466 12/547/464 -f 16/579/496 12/547/464 10/583/500 -f 11/548/465 13/550/467 15/580/497 -f 11/548/465 15/580/497 9/585/502 -f 10/583/500 12/547/464 2/544/461 -f 10/583/500 2/544/461 4/587/504 -f 1/545/462 11/548/465 9/585/502 -f 1/545/462 9/585/502 3/588/505 -f 8/584/501 10/583/500 4/587/504 -f 8/584/501 4/587/504 6/589/506 -f 3/588/505 9/585/502 7/586/503 -f 3/588/505 7/586/503 5/590/507 -f 6/589/506 4/587/504 46/559/476 -f 6/589/506 46/559/476 44/563/480 -f 45/562/479 3/588/505 5/590/507 -f 45/562/479 5/590/507 43/566/483 -f 4/587/504 2/544/461 48/543/460 -f 4/587/504 48/543/460 46/559/476 -f 47/546/463 1/545/462 3/588/505 -f 47/546/463 3/588/505 45/562/479 \ No newline at end of file +f 1/1/1 2/2/2 3/3/3 +f 4/4/4 5/5/5 6/6/6 +f 7/7/7 2/2/2 1/1/1 +f 6/6/6 5/5/5 8/8/8 +f 1/1/1 9/9/9 7/7/7 +f 8/8/8 10/10/10 6/6/6 +f 1/1/1 11/11/11 9/9/9 +f 10/10/10 12/12/12 6/6/6 +f 1/1/1 13/13/13 11/11/11 +f 12/12/12 14/14/14 6/6/6 +f 1/1/1 15/15/15 13/13/13 +f 14/14/14 16/16/16 6/6/6 +f 1/1/1 17/17/17 15/15/15 +f 16/16/16 18/18/18 6/6/6 +f 1/1/1 3/3/3 17/17/17 +f 18/18/18 4/4/4 6/6/6 +f 19/19/19 20/20/20 21/21/21 +f 22/22/22 23/23/23 24/24/24 +f 25/25/25 26/26/26 27/27/27 +f 28/28/28 29/29/29 30/30/30 +f 31/31/31 32/32/32 33/33/33 +f 34/34/34 35/35/35 36/36/36 +f 37/37/37 38/38/38 39/39/39 +f 40/40/40 41/41/41 42/42/42 +f 43/43/43 44/44/44 45/45/45 +f 46/46/46 47/47/47 48/48/48 +f 49/49/49 50/50/50 51/51/51 +f 49/49/49 51/51/51 52/52/52 +f 53/53/53 54/54/54 55/55/55 +f 53/53/53 55/55/55 56/56/56 +f 49/49/49 57/57/57 58/58/58 +f 49/49/49 58/58/58 50/50/50 +f 59/59/59 60/60/60 55/55/55 +f 59/59/59 55/55/55 54/54/54 +f 61/61/61 62/62/62 57/57/57 +f 62/62/62 58/58/58 57/57/57 +f 59/59/59 63/63/63 60/60/60 +f 63/63/63 64/64/64 60/60/60 +f 46/46/46 48/48/48 57/57/57 +f 46/46/46 57/57/57 65/65/65 +f 60/60/60 43/43/43 45/45/45 +f 60/60/60 45/45/45 66/66/66 +f 49/49/49 65/65/65 57/57/57 +f 66/66/66 55/55/55 60/60/60 +f 48/48/48 67/67/67 57/57/57 +f 67/67/67 61/61/61 57/57/57 +f 64/64/64 68/68/68 60/60/60 +f 68/68/68 43/43/43 60/60/60 +f 47/47/47 67/67/67 48/48/48 +f 68/68/68 44/44/44 43/43/43 +f 46/46/46 69/69/69 47/47/47 +f 70/70/70 45/45/45 44/44/44 +f 65/65/65 71/71/71 69/69/69 +f 65/65/65 69/69/69 46/46/46 +f 70/70/70 72/72/72 66/66/66 +f 70/70/70 66/66/66 45/45/45 +f 49/49/49 52/52/52 71/71/71 +f 49/49/49 71/71/71 65/65/65 +f 72/72/72 56/56/56 55/55/55 +f 72/72/72 55/55/55 66/66/66 +f 41/41/41 40/40/40 73/73/73 +f 39/39/39 38/38/38 74/74/74 +f 41/41/41 73/73/73 75/75/75 +f 74/74/74 38/38/38 76/76/76 +f 77/77/77 41/41/41 75/75/75 +f 77/77/77 75/75/75 78/78/78 +f 76/76/76 38/38/38 79/79/79 +f 76/76/76 79/79/79 80/80/80 +f 81/81/81 42/42/42 41/41/41 +f 37/37/37 82/82/82 38/38/38 +f 41/41/41 77/77/77 81/81/81 +f 79/79/79 38/38/38 82/82/82 +f 83/83/83 84/84/84 62/62/62 +f 85/85/85 86/86/86 82/82/82 +f 85/85/85 82/82/82 87/87/87 +f 81/81/81 62/62/62 42/42/42 +f 87/87/87 82/82/82 37/37/37 +f 83/83/83 62/62/62 81/81/81 +f 82/82/82 86/86/86 79/79/79 +f 77/77/77 83/83/83 81/81/81 +f 77/77/77 78/78/78 88/88/88 +f 77/77/77 88/88/88 83/83/83 +f 89/89/89 80/80/80 79/79/79 +f 89/89/89 79/79/79 86/86/86 +f 88/88/88 90/90/90 83/83/83 +f 91/91/91 89/89/89 86/86/86 +f 92/92/92 87/87/87 37/37/37 +f 42/42/42 62/62/62 40/40/40 +f 37/37/37 39/39/39 92/92/92 +f 73/73/73 40/40/40 93/93/93 +f 92/92/92 39/39/39 94/94/94 +f 39/39/39 74/74/74 94/94/94 +f 75/75/75 73/73/73 95/95/95 +f 73/73/73 93/93/93 95/95/95 +f 94/94/94 74/74/74 96/96/96 +f 74/74/74 76/76/76 96/96/96 +f 78/78/78 75/75/75 95/95/95 +f 78/78/78 95/95/95 97/97/97 +f 96/96/96 76/76/76 80/80/80 +f 96/96/96 80/80/80 98/98/98 +f 78/78/78 97/97/97 88/88/88 +f 98/98/98 80/80/80 89/89/89 +f 40/40/40 67/67/67 93/93/93 +f 99/99/99 92/92/92 94/94/94 +f 40/40/40 62/62/62 61/61/61 +f 40/40/40 61/61/61 67/67/67 +f 100/100/100 92/92/92 99/99/99 +f 100/100/100 87/87/87 92/92/92 +f 101/101/101 28/28/28 102/102/102 +f 27/27/27 103/103/103 104/104/104 +f 101/101/101 102/102/102 105/105/105 +f 102/102/102 106/106/106 105/105/105 +f 107/107/107 104/104/104 108/108/108 +f 104/104/104 103/103/103 108/108/108 +f 30/30/30 34/34/34 36/36/36 +f 30/30/30 36/36/36 28/28/28 +f 31/31/31 33/33/33 25/25/25 +f 31/31/31 25/25/25 27/27/27 +f 28/28/28 36/36/36 109/109/109 +f 31/31/31 27/27/27 110/110/110 +f 101/101/101 29/29/29 28/28/28 +f 26/26/26 103/103/103 27/27/27 +f 111/111/111 112/112/112 113/113/113 +f 112/112/112 106/106/106 113/113/113 +f 107/107/107 114/114/114 115/115/115 +f 114/114/114 116/116/116 115/115/115 +f 111/111/111 113/113/113 117/117/117 +f 118/118/118 115/115/115 116/116/116 +f 111/111/111 117/117/117 119/119/119 +f 118/118/118 116/116/116 120/120/120 +f 117/117/117 121/121/121 119/119/119 +f 122/122/122 118/118/118 120/120/120 +f 123/123/123 124/124/124 23/23/23 +f 123/123/123 23/23/23 22/22/22 +f 20/20/20 125/125/125 126/126/126 +f 20/20/20 126/126/126 21/21/21 +f 127/127/127 123/123/123 128/128/128 +f 123/123/123 22/22/22 128/128/128 +f 21/21/21 126/126/126 129/129/129 +f 126/126/126 130/130/130 129/129/129 +f 119/119/119 124/124/124 123/123/123 +f 125/125/125 120/120/120 126/126/126 +f 123/123/123 127/127/127 111/111/111 +f 130/130/130 126/126/126 116/116/116 +f 111/111/111 127/127/127 131/131/131 +f 111/111/111 131/131/131 112/112/112 +f 132/132/132 130/130/130 116/116/116 +f 132/132/132 116/116/116 114/114/114 +f 112/112/112 131/131/131 105/105/105 +f 108/108/108 132/132/132 114/114/114 +f 105/105/105 106/106/106 112/112/112 +f 107/107/107 108/108/108 114/114/114 +f 111/111/111 119/119/119 123/123/123 +f 126/126/126 120/120/120 116/116/116 +f 105/105/105 131/131/131 133/133/133 +f 132/132/132 108/108/108 134/134/134 +f 131/131/131 127/127/127 135/135/135 +f 136/136/136 130/130/130 132/132/132 +f 127/127/127 128/128/128 135/135/135 +f 129/129/129 130/130/130 136/136/136 +f 101/101/101 105/105/105 137/137/137 +f 105/105/105 133/133/133 137/137/137 +f 134/134/134 108/108/108 138/138/138 +f 108/108/108 103/103/103 138/138/138 +f 109/109/109 36/36/36 121/121/121 +f 109/109/109 121/121/121 117/117/117 +f 122/122/122 31/31/31 110/110/110 +f 122/122/122 110/110/110 118/118/118 +f 29/29/29 139/139/139 30/30/30 +f 140/140/140 26/26/26 25/25/25 +f 29/29/29 101/101/101 141/141/141 +f 29/29/29 141/141/141 142/142/142 +f 143/143/143 103/103/103 26/26/26 +f 143/143/143 26/26/26 144/144/144 +f 101/101/101 137/137/137 141/141/141 +f 138/138/138 103/103/103 143/143/143 +f 36/36/36 35/35/35 145/145/145 +f 146/146/146 147/147/147 148/148/148 +f 149/149/149 150/150/150 151/151/151 +f 32/32/32 31/31/31 152/152/152 +f 34/34/34 153/153/153 35/35/35 +f 154/154/154 147/147/147 146/146/146 +f 149/149/149 155/155/155 150/150/150 +f 156/156/156 33/33/33 32/32/32 +f 34/34/34 30/30/30 153/153/153 +f 30/30/30 139/139/139 153/153/153 +f 140/140/140 25/25/25 156/156/156 +f 25/25/25 33/33/33 156/156/156 +f 157/157/157 158/158/158 139/139/139 +f 140/140/140 159/159/159 160/160/160 +f 157/157/157 139/139/139 29/29/29 +f 140/140/140 160/160/160 26/26/26 +f 160/160/160 161/161/161 162/162/162 +f 161/161/161 163/163/163 162/162/162 +f 164/164/164 158/158/158 157/157/157 +f 159/159/159 161/161/161 160/160/160 +f 157/157/157 165/165/165 164/164/164 +f 165/165/165 166/166/166 164/164/164 +f 29/29/29 142/142/142 157/157/157 +f 142/142/142 165/165/165 157/157/157 +f 162/162/162 144/144/144 160/160/160 +f 144/144/144 26/26/26 160/160/160 +f 36/36/36 145/145/145 167/167/167 +f 168/168/168 152/152/152 31/31/31 +f 36/36/36 167/167/167 121/121/121 +f 122/122/122 168/168/168 31/31/31 +f 121/121/121 169/169/169 119/119/119 +f 170/170/170 122/122/122 120/120/120 +f 119/119/119 169/169/169 171/171/171 +f 172/172/172 170/170/170 120/120/120 +f 119/119/119 171/171/171 124/124/124 +f 172/172/172 120/120/120 125/125/125 +f 171/171/171 173/173/173 124/124/124 +f 174/174/174 172/172/172 125/125/125 +f 124/124/124 173/173/173 175/175/175 +f 124/124/124 175/175/175 23/23/23 +f 176/176/176 174/174/174 125/125/125 +f 176/176/176 125/125/125 20/20/20 +f 23/23/23 175/175/175 24/24/24 +f 19/19/19 176/176/176 20/20/20 +f 177/177/177 178/178/178 179/179/179 +f 177/177/177 179/179/179 180/180/180 +f 181/181/181 182/182/182 183/183/183 +f 181/181/181 183/183/183 184/184/184 +f 180/180/180 179/179/179 185/185/185 +f 180/180/180 185/185/185 186/186/186 +f 187/187/187 181/181/181 184/184/184 +f 187/187/187 184/184/184 188/188/188 +f 186/186/186 185/185/185 189/189/189 +f 186/186/186 189/189/189 190/190/190 +f 191/191/191 187/187/187 188/188/188 +f 191/191/191 188/188/188 192/192/192 +f 193/193/193 194/194/194 178/178/178 +f 193/193/193 178/178/178 177/177/177 +f 182/182/182 195/195/195 196/196/196 +f 182/182/182 196/196/196 183/183/183 +f 197/197/197 198/198/198 193/193/193 +f 198/198/198 194/194/194 193/193/193 +f 195/195/195 199/199/199 196/196/196 +f 199/199/199 200/200/200 196/196/196 +f 201/201/201 202/202/202 197/197/197 +f 202/202/202 198/198/198 197/197/197 +f 199/199/199 203/203/203 200/200/200 +f 203/203/203 204/204/204 200/200/200 +f 205/205/205 206/206/206 202/202/202 +f 205/205/205 202/202/202 201/201/201 +f 203/203/203 207/207/207 208/208/208 +f 203/203/203 208/208/208 204/204/204 +f 209/209/209 210/210/210 205/205/205 +f 210/210/210 206/206/206 205/205/205 +f 207/207/207 211/211/211 208/208/208 +f 211/211/211 212/212/212 208/208/208 +f 213/213/213 214/214/214 210/210/210 +f 213/213/213 210/210/210 209/209/209 +f 211/211/211 215/215/215 216/216/216 +f 211/211/211 216/216/216 212/212/212 +f 217/217/217 218/218/218 213/213/213 +f 218/218/218 214/214/214 213/213/213 +f 215/215/215 219/219/219 216/216/216 +f 219/219/219 220/220/220 216/216/216 +f 221/221/221 222/222/222 217/217/217 +f 222/222/222 218/218/218 217/217/217 +f 219/219/219 223/223/223 220/220/220 +f 223/223/223 224/224/224 220/220/220 +f 225/225/225 226/226/226 222/222/222 +f 225/225/225 222/222/222 221/221/221 +f 223/223/223 227/227/227 228/228/228 +f 223/223/223 228/228/228 224/224/224 +f 190/190/190 189/189/189 226/226/226 +f 190/190/190 226/226/226 225/225/225 +f 227/227/227 191/191/191 192/192/192 +f 227/227/227 192/192/192 228/228/228 +f 189/189/189 229/229/229 226/226/226 +f 230/230/230 191/191/191 227/227/227 +f 226/226/226 229/229/229 222/222/222 +f 230/230/230 227/227/227 223/223/223 +f 222/222/222 229/229/229 214/214/214 +f 222/222/222 214/214/214 218/218/218 +f 215/215/215 230/230/230 223/223/223 +f 215/215/215 223/223/223 219/219/219 +f 214/214/214 231/231/231 210/210/210 +f 232/232/232 215/215/215 211/211/211 +f 210/210/210 231/231/231 206/206/206 +f 207/207/207 232/232/232 211/211/211 +f 206/206/206 233/233/233 202/202/202 +f 234/234/234 207/207/207 203/203/203 +f 202/202/202 233/233/233 198/198/198 +f 199/199/199 234/234/234 203/203/203 +f 198/198/198 235/235/235 194/194/194 +f 236/236/236 199/199/199 195/195/195 +f 194/194/194 235/235/235 178/178/178 +f 236/236/236 195/195/195 182/182/182 +f 185/185/185 237/237/237 189/189/189 +f 238/238/238 187/187/187 191/191/191 +f 179/179/179 237/237/237 185/185/185 +f 238/238/238 181/181/181 187/187/187 +f 178/178/178 235/235/235 237/237/237 +f 178/178/178 237/237/237 179/179/179 +f 238/238/238 236/236/236 182/182/182 +f 238/238/238 182/182/182 181/181/181 +f 239/239/239 240/240/240 241/241/241 +f 241/241/241 240/240/240 242/242/242 +f 243/243/243 244/244/244 239/239/239 +f 243/243/243 239/239/239 241/241/241 +f 242/242/242 243/243/243 241/241/241 +f 239/239/239 244/244/244 240/240/240 +f 245/245/245 246/246/246 147/147/147 +f 245/245/245 147/147/147 154/154/154 +f 149/149/149 247/247/247 248/248/248 +f 149/149/149 248/248/248 155/155/155 +f 245/245/245 154/154/154 249/249/249 +f 154/154/154 250/250/250 249/249/249 +f 251/251/251 155/155/155 252/252/252 +f 155/155/155 248/248/248 252/252/252 +f 253/253/253 254/254/254 249/249/249 +f 255/255/255 253/253/253 252/252/252 +f 249/249/249 254/254/254 245/245/245 +f 254/254/254 256/256/256 245/245/245 +f 257/257/257 255/255/255 248/248/248 +f 255/255/255 252/252/252 248/248/248 +f 245/245/245 256/256/256 258/258/258 +f 245/245/245 258/258/258 246/246/246 +f 259/259/259 257/257/257 248/248/248 +f 259/259/259 248/248/248 247/247/247 +f 246/246/246 258/258/258 260/260/260 +f 260/260/260 259/259/259 247/247/247 +f 261/261/261 262/262/262 263/263/263 +f 263/263/263 262/262/262 264/264/264 +f 258/258/258 261/261/261 263/263/263 +f 264/264/264 259/259/259 263/263/263 +f 261/261/261 265/265/265 262/262/262 +f 265/265/265 264/264/264 262/262/262 +f 261/261/261 254/254/254 265/265/265 +f 254/254/254 253/253/253 265/265/265 +f 253/253/253 255/255/255 265/265/265 +f 255/255/255 264/264/264 265/265/265 +f 263/263/263 260/260/260 258/258/258 +f 260/260/260 263/263/263 259/259/259 +f 261/261/261 258/258/258 256/256/256 +f 259/259/259 264/264/264 257/257/257 +f 261/261/261 256/256/256 254/254/254 +f 257/257/257 264/264/264 255/255/255 +f 244/244/244 253/253/253 240/240/240 +f 240/240/240 253/253/253 249/249/249 +f 240/240/240 249/249/249 266/266/266 +f 252/252/252 253/253/253 244/244/244 +f 252/252/252 244/244/244 267/267/267 +f 268/268/268 242/242/242 266/266/266 +f 242/242/242 240/240/240 266/266/266 +f 244/244/244 243/243/243 267/267/267 +f 243/243/243 269/269/269 267/267/267 +f 270/270/270 242/242/242 268/268/268 +f 243/243/243 242/242/242 270/270/270 +f 243/243/243 270/270/270 269/269/269 +f 235/235/235 260/260/260 237/237/237 +f 260/260/260 236/236/236 237/237/237 +f 236/236/236 238/238/238 237/237/237 +f 191/191/191 237/237/237 238/238/238 +f 260/260/260 235/235/235 246/246/246 +f 236/236/236 260/260/260 247/247/247 +f 233/233/233 246/246/246 235/235/235 +f 233/233/233 235/235/235 198/198/198 +f 236/236/236 247/247/247 234/234/234 +f 236/236/236 234/234/234 199/199/199 +f 231/231/231 233/233/233 206/206/206 +f 234/234/234 232/232/232 207/207/207 +f 271/271/271 214/214/214 229/229/229 +f 215/215/215 272/272/272 230/230/230 +f 271/271/271 229/229/229 189/189/189 +f 230/230/230 272/272/272 191/191/191 +f 237/237/237 273/273/273 189/189/189 +f 273/273/273 274/274/274 189/189/189 +f 275/275/275 273/273/273 191/191/191 +f 273/273/273 237/237/237 191/191/191 +f 189/189/189 274/274/274 271/271/271 +f 274/274/274 276/276/276 271/271/271 +f 277/277/277 275/275/275 272/272/272 +f 275/275/275 191/191/191 272/272/272 +f 271/271/271 276/276/276 278/278/278 +f 279/279/279 277/277/277 272/272/272 +f 271/271/271 278/278/278 214/214/214 +f 279/279/279 272/272/272 215/215/215 +f 278/278/278 280/280/280 214/214/214 +f 281/281/281 279/279/279 215/215/215 +f 214/214/214 280/280/280 231/231/231 +f 280/280/280 282/282/282 231/231/231 +f 283/283/283 281/281/281 232/232/232 +f 281/281/281 215/215/215 232/232/232 +f 231/231/231 282/282/282 284/284/284 +f 285/285/285 283/283/283 232/232/232 +f 231/231/231 284/284/284 233/233/233 +f 284/284/284 148/148/148 233/233/233 +f 151/151/151 285/285/285 234/234/234 +f 285/285/285 232/232/232 234/234/234 +f 233/233/233 148/148/148 147/147/147 +f 233/233/233 147/147/147 246/246/246 +f 149/149/149 151/151/151 234/234/234 +f 149/149/149 234/234/234 247/247/247 +f 266/266/266 249/249/249 250/250/250 +f 251/251/251 252/252/252 267/267/267 +f 4/4/4 286/286/286 287/287/287 +f 4/4/4 287/287/287 5/5/5 +f 288/288/288 289/289/289 3/3/3 +f 288/288/288 3/3/3 2/2/2 +f 5/5/5 287/287/287 290/290/290 +f 5/5/5 290/290/290 8/8/8 +f 291/291/291 288/288/288 2/2/2 +f 291/291/291 2/2/2 7/7/7 +f 8/8/8 290/290/290 292/292/292 +f 8/8/8 292/292/292 10/10/10 +f 293/293/293 291/291/291 7/7/7 +f 293/293/293 7/7/7 9/9/9 +f 10/10/10 292/292/292 294/294/294 +f 10/10/10 294/294/294 12/12/12 +f 295/295/295 293/293/293 9/9/9 +f 295/295/295 9/9/9 11/11/11 +f 12/12/12 294/294/294 14/14/14 +f 294/294/294 296/296/296 14/14/14 +f 297/297/297 295/295/295 13/13/13 +f 295/295/295 11/11/11 13/13/13 +f 14/14/14 296/296/296 16/16/16 +f 296/296/296 298/298/298 16/16/16 +f 299/299/299 297/297/297 15/15/15 +f 297/297/297 13/13/13 15/15/15 +f 16/16/16 298/298/298 18/18/18 +f 298/298/298 300/300/300 18/18/18 +f 301/301/301 299/299/299 17/17/17 +f 299/299/299 15/15/15 17/17/17 +f 18/18/18 300/300/300 4/4/4 +f 300/300/300 286/286/286 4/4/4 +f 289/289/289 301/301/301 3/3/3 +f 301/301/301 17/17/17 3/3/3 +f 302/302/302 286/286/286 303/303/303 +f 286/286/286 300/300/300 303/303/303 +f 301/301/301 289/289/289 304/304/304 +f 289/289/289 305/305/305 304/304/304 +f 306/306/306 302/302/302 307/307/307 +f 302/302/302 303/303/303 307/307/307 +f 304/304/304 305/305/305 308/308/308 +f 305/305/305 309/309/309 308/308/308 +f 307/307/307 303/303/303 310/310/310 +f 303/303/303 311/311/311 310/310/310 +f 312/312/312 304/304/304 313/313/313 +f 304/304/304 308/308/308 313/313/313 +f 303/303/303 300/300/300 311/311/311 +f 300/300/300 298/298/298 311/311/311 +f 299/299/299 301/301/301 312/312/312 +f 301/301/301 304/304/304 312/312/312 +f 311/311/311 298/298/298 314/314/314 +f 298/298/298 296/296/296 314/314/314 +f 297/297/297 299/299/299 315/315/315 +f 299/299/299 312/312/312 315/315/315 +f 310/310/310 311/311/311 316/316/316 +f 311/311/311 314/314/314 316/316/316 +f 315/315/315 312/312/312 317/317/317 +f 312/312/312 313/313/313 317/317/317 +f 316/316/316 314/314/314 318/318/318 +f 314/314/314 319/319/319 318/318/318 +f 320/320/320 315/315/315 321/321/321 +f 315/315/315 317/317/317 321/321/321 +f 314/314/314 296/296/296 294/294/294 +f 314/314/314 294/294/294 319/319/319 +f 295/295/295 297/297/297 315/315/315 +f 295/295/295 315/315/315 320/320/320 +f 319/319/319 294/294/294 322/322/322 +f 294/294/294 292/292/292 322/322/322 +f 293/293/293 295/295/295 323/323/323 +f 295/295/295 320/320/320 323/323/323 +f 318/318/318 319/319/319 324/324/324 +f 319/319/319 322/322/322 324/324/324 +f 323/323/323 320/320/320 325/325/325 +f 320/320/320 321/321/321 325/325/325 +f 324/324/324 322/322/322 326/326/326 +f 324/324/324 326/326/326 327/327/327 +f 328/328/328 323/323/323 325/325/325 +f 328/328/328 325/325/325 329/329/329 +f 322/322/322 292/292/292 290/290/290 +f 322/322/322 290/290/290 326/326/326 +f 291/291/291 293/293/293 323/323/323 +f 291/291/291 323/323/323 328/328/328 +f 326/326/326 290/290/290 287/287/287 +f 326/326/326 287/287/287 330/330/330 +f 288/288/288 291/291/291 328/328/328 +f 288/288/288 328/328/328 331/331/331 +f 327/327/327 326/326/326 330/330/330 +f 327/327/327 330/330/330 332/332/332 +f 331/331/331 328/328/328 329/329/329 +f 331/331/331 329/329/329 333/333/333 +f 332/332/332 330/330/330 302/302/302 +f 332/332/332 302/302/302 306/306/306 +f 305/305/305 331/331/331 333/333/333 +f 305/305/305 333/333/333 309/309/309 +f 330/330/330 287/287/287 286/286/286 +f 330/330/330 286/286/286 302/302/302 +f 289/289/289 288/288/288 331/331/331 +f 289/289/289 331/331/331 305/305/305 From a85db4dbe7480d50ea960fad4c53f6d206b4cf3d Mon Sep 17 00:00:00 2001 From: K-Adam Date: Wed, 28 Oct 2026 23:38:55 +0100 Subject: [PATCH 09/13] Add filter tweens, exact tints and measured texture sizes --- examples/cube.html | 10 +- examples/filters.html | 236 ++++++++++++++++++ examples/index.html | 1 + examples/public/textures/can-label.jpg | Bin 0 -> 34116 bytes examples/public/textures/can-lid.jpg | Bin 0 -> 9002 bytes examples/public/textures/dirt.jpg | Bin 0 -> 22945 bytes examples/public/textures/lifebuoy.jpg | Bin 0 -> 50908 bytes examples/public/textures/mountain.jpg | Bin 0 -> 68904 bytes examples/public/textures/ornament.jpg | Bin 0 -> 56842 bytes packages/c3r-three/README.md | 2 +- packages/c3r-three/src/C3RRenderer.ts | 48 ++-- packages/c3r-three/test/C3RRenderer.test.ts | 35 ++- packages/c3r-three/test/earth.browser.test.ts | 21 ++ packages/c3r/README.md | 30 +-- packages/c3r/src/C3R.ts | 10 +- packages/c3r/src/css/Filter.ts | 121 +++++++++ packages/c3r/src/css/Material.ts | 114 +++++---- packages/c3r/src/css/Transform.ts | 63 +++++ packages/c3r/src/css/Tween.ts | 171 ++----------- packages/c3r/src/css/images.ts | 77 ++++++ packages/c3r/src/css/steps.ts | 30 +++ packages/c3r/src/css/styles.css | 16 +- packages/c3r/src/dom/Container.ts | 44 +++- packages/c3r/src/dom/Polygon.ts | 38 ++- packages/c3r/test/c3r.test.ts | 118 +++++++-- packages/c3r/test/element.browser.test.ts | 2 +- packages/c3r/test/polygon.browser.test.ts | 76 ++++++ packages/c3r/test/tween.browser.test.ts | 91 +++++-- 28 files changed, 1035 insertions(+), 319 deletions(-) create mode 100644 examples/filters.html create mode 100644 examples/public/textures/can-label.jpg create mode 100644 examples/public/textures/can-lid.jpg create mode 100644 examples/public/textures/dirt.jpg create mode 100644 examples/public/textures/lifebuoy.jpg create mode 100644 examples/public/textures/mountain.jpg create mode 100644 examples/public/textures/ornament.jpg create mode 100644 packages/c3r/src/css/Filter.ts create mode 100644 packages/c3r/src/css/Transform.ts create mode 100644 packages/c3r/src/css/images.ts create mode 100644 packages/c3r/src/css/steps.ts create mode 100644 packages/c3r/test/polygon.browser.test.ts diff --git a/examples/cube.html b/examples/cube.html index d94c34e..6b8f886 100644 --- a/examples/cube.html +++ b/examples/cube.html @@ -26,7 +26,7 @@
- A spinning box built from CSS 3D transforms, hover to fade + A spinning box built from CSS 3D transforms, hover to brighten
diff --git a/examples/filters.html b/examples/filters.html new file mode 100644 index 0000000..10f1fb0 --- /dev/null +++ b/examples/filters.html @@ -0,0 +1,236 @@ + + + + + + c3r - Filter effects + + + +
+ Filter effects, in plain CSS. Hover a shape in the top row to play its + tween, the bottom row has static filters. +
+ + + + diff --git a/examples/index.html b/examples/index.html index 65f8866..a6f905c 100644 --- a/examples/index.html +++ b/examples/index.html @@ -55,6 +55,7 @@

Standalone

Ported three.js examples

diff --git a/examples/public/textures/can-label.jpg b/examples/public/textures/can-label.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bd544590c352e7ebabc039ca43fa8f6db7a1298 GIT binary patch literal 34116 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 z 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 E*`&fu>;M1& literal 0 HcmV?d00001 diff --git a/examples/public/textures/can-lid.jpg b/examples/public/textures/can-lid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c244ed6b379e2d84a7ec6bb77a9b6010c980c84 GIT binary patch literal 9002 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 ZF-vOJ(M<$ui;!dmv61=bCX+)<|Jer*1VR7+ literal 0 HcmV?d00001 diff --git a/examples/public/textures/lifebuoy.jpg b/examples/public/textures/lifebuoy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5d9e345dc9429bb5321d7f0ac460ab49875fb96 GIT binary patch literal 50908 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 literal 0 HcmV?d00001 diff --git a/examples/public/textures/mountain.jpg b/examples/public/textures/mountain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2efd7815264656c438c8e078def9935892426e6a GIT binary patch literal 68904 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%0A7K*mP6yF?3csC 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 z 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 16, (tint >> 8) & 255, tint & 255]; + target.filter = [ + tint === 0xffffff ? null : C3R.Filter.tint([r / 255, g / 255, b / 255]), + opacity < 1 ? C3R.Filter.opacity(opacity) : null, + ].filter((f) => f !== null); target.doubleSided = material.side !== FrontSide; return map; @@ -414,11 +428,13 @@ function createNode(object: Object3D): C3R.Group { } if (object instanceof Sprite) { + // Painted like a polygon, so its map takes the color's tint const element = document.createElement("div"); + element.style.backgroundImage = + "var(--c3r-tween-layers,) var(--c3r-layers,) var(--c3r-background-image, none)"; element.style.backgroundBlendMode = "multiply"; - element.style.maskImage = "var(--c3r-background-image, none)"; - element.style.maskSize = "100% 100%"; - + element.style.mask = + "var(--c3r-tween-layered, var(--c3r-layered)) var(--c3r-alpha-mask, none) 0 0 / 100% 100%"; const node = new C3R.ElementObject(element); node.setSize(128, 128); node.scale = [1 / 128, 1 / 128]; diff --git a/packages/c3r-three/test/C3RRenderer.test.ts b/packages/c3r-three/test/C3RRenderer.test.ts index 6458e12..66691be 100644 --- a/packages/c3r-three/test/C3RRenderer.test.ts +++ b/packages/c3r-three/test/C3RRenderer.test.ts @@ -175,7 +175,7 @@ it("applies the camera zoom", () => { expect(cssText()).toMatch(/--c3r-camera-fov: ?53\.13/); }); -it("leaves white untinted, so a map needs no mask", () => { +it("tints a map by its color", () => { const { renderer, scene, camera, root } = setup(); const rule = () => materialRule(root().querySelector("[class*=c3r-material-]")!); @@ -186,12 +186,39 @@ it("leaves white untinted, so a map needs no mask", () => { scene.add(new Mesh(new BoxGeometry(), material)); renderer.render(scene, camera); expect(rule()).toMatch(/--c3r-background-color: ?transparent/); - expect(rule()).toContain("--c3r-mask-image: none"); + expect(rule()).not.toContain("--c3r-layers"); material.color.set(0xff0000); renderer.render(scene, camera); - expect(rule()).toMatch(/--c3r-background-color: ?rgba\(255, ?0, ?0/); - expect(rule()).toMatch(/--c3r-mask-image: ?var\(--c3r-background-image/); + expect(rule()).toMatch(/--c3r-layers: ?linear-gradient\(rgb\(100% 0% 0%\)/); + + // Beyond white in HDR, clamped like getHex rather than rejected + material.color.setRGB(2, 0, 0); + renderer.render(scene, camera); + expect(rule()).toMatch(/--c3r-layers: ?linear-gradient\(rgb\(100% 0% 0%\)/); + + material.transparent = true; + material.opacity = 0.4; + renderer.render(scene, camera); + expect(rule()).toMatch(/--c3r-filter: ?opacity\(0\.4\)/); + expect(rule()).toMatch(/--c3r-layers: ?linear-gradient/); + material.dispose(); +}); + +it("keeps a canvas map's url across a swap", () => { + const { renderer, scene, camera, root } = setup(); + const rule = () => + materialRule(root().querySelector("[class*=c3r-material-]")!); + const canvas = document.createElement("canvas"); + canvas.toDataURL = () => "data:image/png;base64,AA"; + const map = new Texture(canvas); + const material = new MeshBasicMaterial({ map, color: 0xff0000 }); + scene.add(new Mesh(new BoxGeometry(), material)); + for (const next of [map, null, map]) { + material.map = next; + renderer.render(scene, camera); + } + expect(rule()).toContain("data:image/png;base64,AA"); material.dispose(); }); diff --git a/packages/c3r-three/test/earth.browser.test.ts b/packages/c3r-three/test/earth.browser.test.ts index 5a658e0..51cae53 100644 --- a/packages/c3r-three/test/earth.browser.test.ts +++ b/packages/c3r-three/test/earth.browser.test.ts @@ -11,6 +11,8 @@ import { PlaneGeometry, Scene, SphereGeometry, + Sprite, + SpriteMaterial, SRGBColorSpace, TextureLoader, WebGLRenderer, @@ -134,3 +136,22 @@ it("renders the earth example like WebGLRenderer", async () => { } expect(ratio).toBeLessThan(LIMIT); }); + +it("tints a sprite's map by its color", () => { + const canvas = canvas2d().canvas; + const scene = new Scene(); + scene.add( + new Sprite( + new SpriteMaterial({ map: new CanvasTexture(canvas), color: 0xff0000 }), + ), + ); + const c3r = new C3RRenderer(); + c3r.setSize(WIDTH, HEIGHT); + document.body.appendChild(c3r.domElement); + c3r.render(scene, new PerspectiveCamera()); + const sprite = c3r.domElement.querySelector(".c3r-element")!; + const { backgroundImage, maskImage } = getComputedStyle(sprite); + expect(backgroundImage).toMatch(/^linear-gradient\(rgb\(255, 0, 0\)/); + expect(maskImage).toMatch(/^url\("data:/); + c3r.domElement.remove(); +}); diff --git a/packages/c3r/README.md b/packages/c3r/README.md index dc0a0a9..3dad567 100644 --- a/packages/c3r/README.md +++ b/packages/c3r/README.md @@ -39,31 +39,33 @@ container.root.addChild(box); box.addMesh(cube({ sx: 200 })); box.material = new Material(); -box.material.backgroundImageSrc = "crate.jpg"; +box.material.background = "crate.jpg"; container.camera.matrix = mat4.fromTranslation(mat4.create(), [0, 0, 400]); ``` -| Class | What it is | -| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `unitScale`, `bake()` fits it, `toHTML()` | -| `Group` | A transformed node: `matrix`, `tween` (one or an array), `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | -| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset` | -| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | -| `Tween` | A CSS animation of a group or camera: `keyframes` of `Transform` and `Filter` steps, `from`, `duration`, `delay`, `easing`, `loop`, `alternate`, `paused`, `hover` | -| `Transform`, `Filter` | Steps from factories: `translate` (scene units), `rotateX`, `rotateY`, `rotateZ`, `scale`; `opacity`, `brightness`, `contrast`, `saturate`, `grayscale`, `sepia`, `invert`, `hueRotate`, `blur` (px of each polygon's element) | -| `Material` | `backgroundColor`, `backgroundImageSrc`, `filter` (one or an array of `Filter` steps, before a tween's), `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | -| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (pose), `viewMatrix` (read-only inverse), `tween`, and `fov`, or `left`, `right`, `top`, `bottom` | +| Class | What it is | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `unitScale`, `bake()` fits it, `toHTML()` (async) | +| `Group` | A transformed node: `matrix`, `tween` (one or an array), `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | +| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset`, `textureSize` (set it for a data url, otherwise `bake()` measures it) | +| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | +| `Tween` | A CSS animation of a group or camera: `keyframes` of `Transform` and `Filter` steps, `from`, `duration`, `delay`, `easing`, `loop`, `alternate`, `paused`, `hover` | +| `Transform`, `Filter` | Steps from factories: `translate` (scene units), `rotateX`, `rotateY`, `rotateZ`, `scale`; `opacity`, `brightness`, `contrast`, `saturate`, `grayscale`, `sepia`, `invert`, `hueRotate`, `tint` | +| `Material` | `background` (an rgba color or an image URL), `filter` (one or an array of `Filter` steps, before a tween's), `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | +| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (pose), `viewMatrix` (read-only inverse), `tween`, and `fov`, or `left`, `right`, `top`, `bottom` | -An image's alpha shows through, also when a color tints it; a material with only an image drops an inherited tint. Every property applies on assignment; there is no `update()` to call. A polygon is laid out from its vertices on construction, so put it in a group to move it. +An image's alpha shows through. A color and an image don't combine, tint either with `Filter.tint`; a color hides an inherited image and an image hides an inherited color. Every property applies on assignment; there is no `update()` to call. A polygon is laid out from its vertices on construction, so put it in a group to move it. A `Material`, `Tween` or camera is a class rule in one shared stylesheet, so the objects using it share one style. The rule stays until `[Symbol.dispose]()` is called, or the owner leaves a `using` block; otherwise it is removed once the owner and its elements are garbage-collected. A tween animates a group after its `matrix`, from rest or from the `from` steps, and a group's tweens apply in array order. Its keyframes play in sequence, `duration` seconds each unless written as `{ steps, duration }`, and `easing` applies to each; a keyframe is one step or an array of steps, and what it doesn't list holds. Transforms apply in the order they first appear, `from` first. Angles are radians and may exceed a half turn. `Filter` steps apply to the polygons and `ElementObject` elements, and a nested group's filters replace its parent's. With `hover`, a `loop` plays only while hovered; any other tween takes one keyframe and eases to it and back. Setting `paused` later pauses everything using the tween; a hover transition can't pause, so it stops responding to hover instead. It runs on the main thread and `bake()` ignores its scale. Use a negative `delay`, in seconds, to offset the phase. +`Filter.tint(color)` multiplies each pixel by an sRGB color in 0-1, like a sprite tint. It applies to polygons only, before the other filters, and semi-transparent pixels take a slight tint halo. + Aim a camera with `mat4.targetTo(mat4.create(), eye, target, [0, 1, 0])`. Its tween moves it after its `matrix` (`translate([0, 0, 400])` backs away) and can't `hover`; its filters apply to every group without its own, and `bake()` ignores it. -On a live page, call `container.bake()` after building or heavily scaling the scene; `toHTML()` calls it for you. +On a live page, call `container.bake()` after building, heavily scaling or changing textures; `toHTML()` awaits it for you. It also sizes polygons to their image's texels, loading each url once. An orthographic camera needs `setSize()`: without it the container takes the window size at construction and does not follow resizes. @@ -87,7 +89,7 @@ const container = new Container(); container.setSize(800, 600); // ... build the scene -const html = `${container.toHTML()}`; +const html = `${await container.toHTML()}`; ``` See the [examples](https://k-adam.github.io/CSS3D-Renderer/). diff --git a/packages/c3r/src/C3R.ts b/packages/c3r/src/C3R.ts index 74793a1..4355158 100644 --- a/packages/c3r/src/C3R.ts +++ b/packages/c3r/src/C3R.ts @@ -1,11 +1,7 @@ export { Material } from "./css/Material.js"; -export { - Filter, - type Keyframe, - Transform, - Tween, - type TweenOptions, -} from "./css/Tween.js"; +export { Filter } from "./css/Filter.js"; +export { Transform } from "./css/Transform.js"; +export { type Keyframe, Tween, type TweenOptions } from "./css/Tween.js"; export { cssText } from "./css/styles.js"; export { Object3D } from "./dom/Object3D.js"; diff --git a/packages/c3r/src/css/Filter.ts b/packages/c3r/src/css/Filter.ts new file mode 100644 index 0000000..a467708 --- /dev/null +++ b/packages/c3r/src/css/Filter.ts @@ -0,0 +1,121 @@ +import type { ReadonlyVec3 } from "gl-matrix"; + +import { + type Kind, + radians, + register, + type Step, + stepOf, + stepText, +} from "./steps.js"; + +const amount = (n: number): string => { + if (!(n >= 0 && Number.isFinite(n))) + throw new RangeError(`Invalid amount ${n}`); + return String(n); +}; + +export class Filter { + declare private readonly brand: "filter"; + + private constructor() {} + + static #create( + name: string, + identity: string, + value: string, + syntax = "", + kind: Kind = "filter", + ): Filter { + return register(new Filter(), { + name, + kind, + syntax, + identity, + values: [value], + }); + } + + static opacity(n: number): Filter { + return Filter.#create("opacity", "1", amount(n)); + } + + static brightness(n: number): Filter { + return Filter.#create("brightness", "1", amount(n)); + } + + static contrast(n: number): Filter { + return Filter.#create("contrast", "1", amount(n)); + } + + static saturate(n: number): Filter { + return Filter.#create("saturate", "1", amount(n)); + } + + static grayscale(n: number): Filter { + return Filter.#create("grayscale", "0", amount(n)); + } + + static sepia(n: number): Filter { + return Filter.#create("sepia", "0", amount(n)); + } + + static invert(n: number): Filter { + return Filter.#create("invert", "0", amount(n)); + } + + static hueRotate(angle: number): Filter { + return Filter.#create("hue-rotate", "0rad", radians(angle), ""); + } + + // Multiplies each pixel by an sRGB color + static tint(color: ReadonlyVec3): Filter { + const values = Array.from(color); + if (values.length !== 3 || !values.every((c) => c >= 0 && c <= 1)) + throw new RangeError(`Invalid color ${values}`); + // Legacy rgb() interpolates in sRGB, so a tween tints linearly + const rgb = values.map((c) => `${c * 100}%`).join(" "); + return Filter.#create("tint", "white", `rgb(${rgb})`, "", "layer"); + } +} + +export const filterSteps = ( + filter: Filter | readonly Filter[] | null, +): Step[] => + [filter ?? []].flat().map((f) => { + const step = stepOf(f); + if (!step || step.kind === "transform") throw new TypeError("Not a Filter"); + return step; + }); + +// Any filter replaces the parent's filters and layers, none inherits them +export function filterVariables( + prefix: string, + filter: string, + layers: string, +): Record { + const unset = filter || layers ? "initial" : ""; + return { + [`${prefix}filter`]: filter || unset, + [`${prefix}layers`]: layers || unset, + [`${prefix}layered`]: layers ? "alpha" : unset, + }; +} + +// Background layers must be images, a solid color has no image form yet +const layerText = (color: string) => `linear-gradient(${color}, ${color}),`; + +export function filterTexts( + steps: Step[], + args = (step: Step) => step.values, +): { filter: string; layers: string } { + const of = (kind: Kind) => steps.filter((s) => s.kind === kind); + return { + filter: of("filter") + .map((s) => stepText(s, args(s))) + .join(" "), + layers: of("layer") + .map((s) => layerText(args(s)[0])) + .join(" "), + }; +} diff --git a/packages/c3r/src/css/Material.ts b/packages/c3r/src/css/Material.ts index aad6cde..ea5d419 100644 --- a/packages/c3r/src/css/Material.ts +++ b/packages/c3r/src/css/Material.ts @@ -2,48 +2,77 @@ import "../polyfill.js"; import { vec4, type ReadonlyVec4 } from "gl-matrix"; +import { + type Filter, + filterSteps, + filterTexts, + filterVariables, +} from "./Filter.js"; +import { loadImage } from "./images.js"; import { deleteRule, insertRule } from "./styles.js"; -import { type Filter, filterText } from "./Tween.js"; let nextId = 0; export class Material { readonly className = `c3r-material-${nextId++}`; - #backgroundImageSrc: string | null = null; - #backgroundImage: string | null = null; - #backgroundColor: ReadonlyVec4 | null = null; + #background: ReadonlyVec4 | string | null = null; #filter: Filter | readonly Filter[] | null = null; - #filterText = ""; + #filterKey = ""; #doubleSided = false; #rule: CSSStyleRule | null = insertRule(`.${this.className}`, this); - get backgroundImageSrc(): string | null { - return this.#backgroundImageSrc; + // An rgba color, 0-1, or an image url; either hides the other from a parent + get background(): ReadonlyVec4 | string | null { + return this.#background; } - set backgroundImageSrc(src: string | null) { - if (src === this.#backgroundImageSrc) return; - this.#backgroundImageSrc = src; - // A newline only has a hex escape - const escape = (c: string) => `\\${c.charCodeAt(0).toString(16)} `; - this.#backgroundImage = - src && `url("${src.replace(/["\\\n\r\f]/g, escape)}")`; - this.#set("--c3r-background-image", this.#backgroundImage); - this.#paint(); - } - - // rgba, 0-1 - get backgroundColor(): ReadonlyVec4 | null { - return this.#backgroundColor; - } - - set backgroundColor(color: ReadonlyVec4 | null) { - const old = this.#backgroundColor; - if (color === old || (color && old && vec4.exactEquals(color, old))) return; - this.#backgroundColor = color && vec4.clone(color); - this.#paint(); + set background(background: ReadonlyVec4 | string | null) { + // url("") would load the page itself + if (background === "") background = null; + const old = this.#background; + const same = + typeof background === "object" && + typeof old === "object" && + background && + old + ? vec4.exactEquals(background, old) + : background === old; + if (same) return; + let image: string | null = null; + let color: string | null = null; + let opaque: string | null = null; + let alpha: string | null = null; + if (typeof background === "string") { + // A newline only has a hex escape + const escape = (c: string) => `\\${c.charCodeAt(0).toString(16)} `; + image = `url("${background.replace(/["\\\n\r\f]/g, escape)}")`; + color = opaque = "transparent"; + alpha = "1"; + this.#background = background; + void loadImage(background).then((info) => { + if (info?.opaque && this.#background === background) + this.#set("--c3r-alpha-mask", "none"); + }); + } else if (background) { + const [r, g, b, a] = background; + const rgb = [r, g, b].map((c) => Math.round(c * 255)); + image = "none"; + color = `rgba(${rgb.join()},${a})`; + // Faded by opacity on polygons, so a tint stays exact + opaque = `rgb(${rgb.join()})`; + alpha = String(a); + this.#background = vec4.clone(background); + } else { + this.#background = null; + } + this.#set("--c3r-background-image", image); + this.#set("--c3r-background-color", color); + this.#set("--c3r-background-opaque", opaque); + this.#set("--c3r-background-alpha", alpha); + // Masks a tint layer out of transparent pixels + this.#set("--c3r-alpha-mask", image); } get filter(): Filter | readonly Filter[] | null { @@ -51,11 +80,14 @@ export class Material { } set filter(filter: Filter | readonly Filter[] | null) { - const text = filterText(filter); + const texts = filterTexts(filterSteps(filter)); this.#filter = Array.isArray(filter) ? Object.freeze([...filter]) : filter; - if (text === this.#filterText) return; - this.#filterText = text; - this.#set("--c3r-filter", text || null); + const key = `${texts.filter}\n${texts.layers}`; + if (key === this.#filterKey) return; + this.#filterKey = key; + const variables = filterVariables("--c3r-", texts.filter, texts.layers); + for (const [name, value] of Object.entries(variables)) + this.#set(name, value || null); } get doubleSided(): boolean { @@ -68,24 +100,6 @@ export class Material { this.#set("backface-visibility", doubleSided ? "visible" : null); } - // A color layer fills an image's transparent pixels, so only a tint is masked - #paint(): void { - const image = this.#backgroundImage; - const tint = this.#backgroundColor; - let color = image ? "transparent" : null; - if (tint) { - const [r, g, b, a] = tint; - const rgb = [r, g, b].map((c) => Math.round(c * 255)); - color = `rgba(${rgb.join()},${a})`; - } - this.#set("--c3r-background-color", color); - // "none" so a parent material's mask doesn't inherit - this.#set( - "--c3r-mask-image", - tint ? "var(--c3r-background-image, none)" : image && "none", - ); - } - #set(name: string, value: string | null): void { const style = this.#rule?.style; if (!style) return; diff --git a/packages/c3r/src/css/Transform.ts b/packages/c3r/src/css/Transform.ts new file mode 100644 index 0000000..1dff6ee --- /dev/null +++ b/packages/c3r/src/css/Transform.ts @@ -0,0 +1,63 @@ +import type { ReadonlyVec3 } from "gl-matrix"; + +import { radians, register } from "./steps.js"; + +const vector = (v: ReadonlyVec3, unit = ""): string[] => { + const values = Array.from(v); + if (values.length !== 3 || !values.every(Number.isFinite)) + throw new RangeError(`Invalid vector ${values}`); + return values.map((n) => n + unit); +}; + +const negate = (value: string) => `calc(-1 * ${value})`; + +export class Transform { + declare private readonly brand: "transform"; + + private constructor() {} + + static #create( + name: string, + syntax: string, + identity: string, + values: string[], + invert = negate, + ): Transform { + return register(new Transform(), { + name, + kind: "transform", + syntax, + identity, + values, + invert, + }); + } + + // Scene units + static translate(v: ReadonlyVec3): Transform { + return Transform.#create("translate3d", "", "0px", vector(v, "px")); + } + + static rotateX(angle: number): Transform { + return Transform.#create("rotateX", "", "0rad", [radians(angle)]); + } + + static rotateY(angle: number): Transform { + return Transform.#create("rotateY", "", "0rad", [radians(angle)]); + } + + static rotateZ(angle: number): Transform { + return Transform.#create("rotateZ", "", "0rad", [radians(angle)]); + } + + static scale(s: number | ReadonlyVec3): Transform { + const v = typeof s === "number" ? [s, s, s] : s; + return Transform.#create( + "scale3d", + "", + "1", + vector(v), + (value) => `calc(1 / ${value})`, + ); + } +} diff --git a/packages/c3r/src/css/Tween.ts b/packages/c3r/src/css/Tween.ts index ddca45e..bf44063 100644 --- a/packages/c3r/src/css/Tween.ts +++ b/packages/c3r/src/css/Tween.ts @@ -1,151 +1,9 @@ import "../polyfill.js"; -import type { ReadonlyVec3 } from "gl-matrix"; - +import { type Filter, filterTexts, filterVariables } from "./Filter.js"; +import { type Step, stepOf, stepText } from "./steps.js"; import { deleteRule, insertRule } from "./styles.js"; - -interface Step { - name: string; - syntax: string; - identity: string; - values: string[]; - // Set on transforms only, which also tells them from filters - invert?: (value: string) => string; -} - -// Only factory-made steps, a forged one would inject raw CSS -const steps = new WeakMap(); - -const vector = (v: ReadonlyVec3, unit = ""): string[] => { - const values = Array.from(v); - if (values.length !== 3 || !values.every(Number.isFinite)) - throw new RangeError(`Invalid vector ${values}`); - return values.map((n) => n + unit); -}; - -const negate = (value: string) => `calc(-1 * ${value})`; - -const radians = (angle: number): string => { - if (!Number.isFinite(angle)) throw new RangeError(`Invalid angle ${angle}`); - return `${angle}rad`; -}; - -const amount = (n: number): string => { - if (!(n >= 0 && Number.isFinite(n))) - throw new RangeError(`Invalid amount ${n}`); - return String(n); -}; - -export class Transform { - declare private readonly brand: "transform"; - - private constructor() {} - - static #create( - name: string, - syntax: string, - identity: string, - values: string[], - invert = negate, - ): Transform { - const transform = new Transform(); - steps.set(transform, { name, syntax, identity, values, invert }); - return transform; - } - - // Scene units - static translate(v: ReadonlyVec3): Transform { - return Transform.#create("translate3d", "", "0px", vector(v, "px")); - } - - static rotateX(angle: number): Transform { - return Transform.#create("rotateX", "", "0rad", [radians(angle)]); - } - - static rotateY(angle: number): Transform { - return Transform.#create("rotateY", "", "0rad", [radians(angle)]); - } - - static rotateZ(angle: number): Transform { - return Transform.#create("rotateZ", "", "0rad", [radians(angle)]); - } - - static scale(s: number | ReadonlyVec3): Transform { - const v = typeof s === "number" ? [s, s, s] : s; - return Transform.#create( - "scale3d", - "", - "1", - vector(v), - (value) => `calc(1 / ${value})`, - ); - } -} - -export class Filter { - declare private readonly brand: "filter"; - - private constructor() {} - - static #create( - name: string, - identity: string, - value: string, - syntax = "", - ): Filter { - const filter = new Filter(); - steps.set(filter, { name, syntax, identity, values: [value] }); - return filter; - } - - static opacity(n: number): Filter { - return Filter.#create("opacity", "1", amount(n)); - } - - static brightness(n: number): Filter { - return Filter.#create("brightness", "1", amount(n)); - } - - static contrast(n: number): Filter { - return Filter.#create("contrast", "1", amount(n)); - } - - static saturate(n: number): Filter { - return Filter.#create("saturate", "1", amount(n)); - } - - static grayscale(n: number): Filter { - return Filter.#create("grayscale", "0", amount(n)); - } - - static sepia(n: number): Filter { - return Filter.#create("sepia", "0", amount(n)); - } - - static invert(n: number): Filter { - return Filter.#create("invert", "0", amount(n)); - } - - static hueRotate(angle: number): Filter { - return Filter.#create("hue-rotate", "0rad", radians(angle), ""); - } - - // px of each polygon's element - static blur(radius: number): Filter { - return Filter.#create("blur", "0px", `${amount(radius)}px`, ""); - } -} - -export function filterText(filter: Filter | readonly Filter[] | null): string { - return [filter ?? []] - .flat() - .map((f) => { - const step = steps.get(f); - if (!step || step.invert) throw new TypeError("Not a Filter"); - return `${step.name}(${step.values[0]})`; - }) - .join(" "); -} +import type { Transform } from "./Transform.js"; type Steps = Transform | Filter | readonly (Transform | Filter)[]; export type Keyframe = Steps | { steps: Steps; duration?: number }; @@ -167,6 +25,7 @@ interface Style { transform?: string; inverse?: string; filter?: string; + layers?: string; animation?: string; transition?: string; hover?: boolean; @@ -195,7 +54,11 @@ export function setTweens( : list("transform", " "), animation: list("animation", ", "), transition: list("transition", ", "), - "--c3r-tween-filter": list("filter", " "), + ...filterVariables( + "--c3r-tween-", + list("filter", " "), + list("layers", " "), + ), }; for (const [name, value] of Object.entries(properties)) { if (value) style?.setProperty(name, value); @@ -231,7 +94,7 @@ export class Tween { const apply = (changes: Steps, where: string) => { const names = new Set(); for (const change of [changes].flat()) { - const step = steps.get(change); + const step = stepOf(change); if (!step) throw new TypeError("Not a Transform or Filter"); if (names.has(step.name)) throw new RangeError(`${step.name} twice in ${where}`); @@ -287,8 +150,7 @@ export class Tween { const property = (s: Step, i: number) => `${track}-${s.name}${s.values.length > 1 ? `-${"xyz"[i]}` : ""}`; const used = [...pose.values()]; - const transforms = used.filter((s) => s.invert); - const filters = used.filter((s) => !s.invert); + const transforms = used.filter((s) => s.kind === "transform"); const frame = (stop: Map) => used.flatMap((s) => s.values.map((_, i): [string, string] => [ @@ -344,17 +206,16 @@ export class Tween { // Fallbacks keep the element's other tweens when this one is disposed const part: Style = { hover }; if (transforms.length) { - part.transform = transforms - .map((s) => `${s.name}(${args(s).join()})`) - .join(" "); + part.transform = transforms.map((s) => stepText(s, args(s))).join(" "); part.inverse = transforms .toReversed() - .map((s) => `${s.name}(${args(s).map(s.invert!).join()})`) + .map((s) => stepText(s, args(s).map(s.invert!))) .join(" "); } // Inherited as resolved text, a filter on the group would flatten it - if (filters.length) - part.filter = filters.map((s) => `${s.name}(${args(s)[0]})`).join(" "); + const { filter, layers } = filterTexts(used, args); + if (filter) part.filter = filter; + if (layers) part.layers = layers; if (transition) { style.setProperty( `${track}-transition`, diff --git a/packages/c3r/src/css/images.ts b/packages/c3r/src/css/images.ts new file mode 100644 index 0000000..2be73ff --- /dev/null +++ b/packages/c3r/src/css/images.ts @@ -0,0 +1,77 @@ +import type { ReadonlyVec2 } from "gl-matrix"; + +export interface ImageInfo { + size: ReadonlyVec2; + opaque: boolean; +} + +// Larger textures keep their mask +const MAX_SCAN = 4096 * 4096; + +const loads = new Map>(); +const settled = new Map(); + +async function decode(url: string, cors: boolean): Promise { + const image = new Image(); + if (cors) image.crossOrigin = "anonymous"; + image.src = url; + await image.decode(); + return image; +} + +// Full size, a downscale can skip thin transparent areas +function isOpaque(image: HTMLImageElement): boolean { + const { naturalWidth: width, naturalHeight: height } = image; + if (width * height > MAX_SCAN) return false; + const context = document.createElement("canvas").getContext("2d"); + if (!context) return false; + context.canvas.width = width; + context.canvas.height = height; + context.drawImage(image, 0, 0); + const { data } = context.getImageData(0, 0, width, height); + for (let i = 3; i < data.length; i += 4) if (data[i] < 255) return false; + return true; +} + +async function read(url: string): Promise { + let image: HTMLImageElement; + let readable = true; + try { + image = await decode(url, true); + } catch { + // Like the CSS background, for the size only + try { + image = await decode(url, false); + readable = false; + } catch { + return null; + } + } + const { naturalWidth, naturalHeight } = image; + if (!naturalWidth || !naturalHeight) return null; + let opaque = false; + try { + opaque = readable && isOpaque(image); + } catch {} + return { size: [naturalWidth, naturalHeight], opaque }; +} + +// Data urls are skipped, a canvas map makes a new one each frame +const skipped = (url: string): boolean => url.startsWith("data:"); + +export function loadImage(url: string): Promise { + if (skipped(url)) return Promise.resolve(null); + let load = loads.get(url); + if (!load) { + load = read(url).then((info) => { + settled.set(url, info); + return info; + }); + loads.set(url, load); + } + return load; +} + +export function imageInfo(url: string): ImageInfo | null | undefined { + return skipped(url) ? null : settled.get(url); +} diff --git a/packages/c3r/src/css/steps.ts b/packages/c3r/src/css/steps.ts new file mode 100644 index 0000000..6d1a1ba --- /dev/null +++ b/packages/c3r/src/css/steps.ts @@ -0,0 +1,30 @@ +export type Kind = "transform" | "filter" | "layer"; + +export interface Step { + name: string; + kind: Kind; + syntax: string; + identity: string; + values: string[]; + // Transforms only, for the camera + invert?: (value: string) => string; +} + +// Only factory-made steps, a forged one would inject raw CSS +const steps = new WeakMap(); + +export function register(owner: T, step: Step): T { + steps.set(owner, step); + return owner; +} + +export const stepOf = (value: unknown): Step | undefined => + steps.get(value as object); + +export const stepText = (step: Step, args = step.values): string => + `${step.name}(${args.join()})`; + +export const radians = (angle: number): string => { + if (!Number.isFinite(angle)) throw new RangeError(`Invalid angle ${angle}`); + return `${angle}rad`; +}; diff --git a/packages/c3r/src/css/styles.css b/packages/c3r/src/css/styles.css index b973e5b..0633692 100644 --- a/packages/c3r/src/css/styles.css +++ b/packages/c3r/src/css/styles.css @@ -95,8 +95,6 @@ .c3r-polygon { width: var(--c3r-width, 0px); height: var(--c3r-height, 0px); - /* Empty, so no filter, unless a material or tween sets one */ - filter: var(--c3r-filter,) var(--c3r-tween-filter,); transform-style: flat; overflow: hidden; } @@ -109,12 +107,18 @@ .c3r-polygon-content { width: 100%; height: 100%; - background-color: var(--c3r-background-color, white); - background-image: var(--c3r-background-image, none); + background-color: var(--c3r-background-opaque, white); + /* Layers end in a comma and multiply what is below */ + background-image: var(--c3r-tween-layers,) var(--c3r-layers,) + var(--c3r-background-image, none); background-size: 100% 100%; background-blend-mode: multiply; - mask-image: var(--c3r-mask-image, none); - mask-size: 100% 100%; + opacity: var(--c3r-background-alpha, 1); + /* Invalid without layers, else the image's alpha cuts them out */ + mask: var(--c3r-tween-layered, var(--c3r-layered)) var(--c3r-alpha-mask, none) + 0 0 / 100% 100%; + /* Painted with the content, off the composited 3D layer */ + filter: var(--c3r-filter,) var(--c3r-tween-filter,); transform: matrix(1, 0, 0, 1, 0, 0); transform-origin: 0 0; } diff --git a/packages/c3r/src/dom/Container.ts b/packages/c3r/src/dom/Container.ts index 5c04758..f7db865 100644 --- a/packages/c3r/src/dom/Container.ts +++ b/packages/c3r/src/dom/Container.ts @@ -1,12 +1,14 @@ import { mat4, type ReadonlyMat4 } from "gl-matrix"; import type { Camera } from "../css/Camera.js"; +import { imageInfo, loadImage } from "../css/images.js"; import { PerspectiveCamera } from "../css/PerspectiveCamera.js"; import { cssText } from "../css/styles.js"; +import { ElementObject } from "./ElementObject.js"; import { Group } from "./Group.js"; import type { Object3D } from "./Object3D.js"; -import { Polygon } from "./Polygon.js"; +import { measurePolygon, Polygon } from "./Polygon.js"; // Keeps a Camera, and its rules, alive while its element is const elementCameras = new WeakMap(); @@ -21,6 +23,7 @@ export class Container { #width = 0; #height = 0; #unitScale = 1; + #refit: Promise | null = null; constructor() { this.domElement.classList.add( @@ -81,12 +84,38 @@ export class Container { this.domElement.style.setProperty("--c3r-unit-scale", String(scale)); } + bake(): Promise { + const loading = this.#fit(); + if (!loading.length) return Promise.resolve(); + // One refit at a time, c3r-three bakes every frame + this.#refit ??= Promise.all(loading) + .finally(() => (this.#refit = null)) + .then(() => this.bake()); + return this.#refit; + } + // Fits the unit scale: the densest polygon at one view pixel per DOM pixel, a // power of two scales exactly and holds still while objects move - bake(): void { + #fit(): Promise[] { let density = 0; - const visit = (node: Object3D, parent: ReadonlyMat4) => { + const loading: Promise[] = []; + const visit = ( + node: Object3D, + parent: ReadonlyMat4, + image: string | null, + ) => { if (node.domElement.style.display === "none") return; + // Like the CSS variables: an image or a color replaces, null inherits + const background = node.material?.background; + if (background != null && !(node instanceof ElementObject)) + image = typeof background === "string" ? background : null; + if (node instanceof Polygon) { + const info = image === null ? null : imageInfo(image); + // Keeps the old size while a new image loads + if (info === undefined) loading.push(loadImage(image!)); + else measurePolygon(node, info?.size ?? null); + } + // Measuring refits the matrix const m = mat4.mul(mat4.create(), parent, node.matrix); if (node instanceof Polygon) { const scale = Math.min( @@ -95,16 +124,17 @@ export class Container { ); if (scale > 0) density = Math.max(density, 1 / scale); } else if (node instanceof Group) { - for (const child of node.children) visit(child, m); + for (const child of node.children) visit(child, m, image); } }; - visit(this.#root, this.#camera.viewMatrix); + visit(this.#root, this.#camera.viewMatrix, null); const exponent = Math.ceil(Math.log2(density || 1)); this.unitScale = 2 ** Math.min(Math.max(exponent, -20), 20); + return loading; } - toHTML(): string { - this.bake(); + async toHTML(): Promise { + await this.bake(); // So no value can close the style element const css = cssText().replaceAll("<", "\\3c "); return `${this.domElement.outerHTML}`; diff --git a/packages/c3r/src/dom/Polygon.ts b/packages/c3r/src/dom/Polygon.ts index ca63640..ce32e1d 100644 --- a/packages/c3r/src/dom/Polygon.ts +++ b/packages/c3r/src/dom/Polygon.ts @@ -128,6 +128,15 @@ export interface PolygonOptions { edges?: readonly EdgeNeighbour[]; } +const sameSize = (a: ReadonlyVec2 | null, b: ReadonlyVec2 | null) => + a === b || (!!a && !!b && vec2.exactEquals(a, b)); + +// Friend access for Container.bake(), a public setter would be API +export let measurePolygon: ( + polygon: Polygon, + size: ReadonlyVec2 | null, +) => void; + export class Polygon extends Object3D { readonly vertices: readonly Vertex[]; // vertices in CCW readonly contentElement: HTMLElement; @@ -137,6 +146,7 @@ export class Polygon extends Object3D { #uvScale: ReadonlyVec2 = [1, 1]; #uvOffset: ReadonlyVec2 = [0, 0]; #textureSize: ReadonlyVec2 | null = null; + #measuredSize: ReadonlyVec2 | null = null; #pixelRatio = globalThis.devicePixelRatio || 1; #getDomSize: (size: number) => number; @@ -211,7 +221,7 @@ export class Polygon extends Object3D { set uvScale(scale: ReadonlyVec2) { if (vec2.exactEquals(scale, this.#uvScale)) return; this.#uvScale = vec2.clone(scale); - if (this.#textureSize) this.#fit(); + if (this.#size) this.#fit(); this.#updateContent(); } @@ -221,13 +231,28 @@ export class Polygon extends Object3D { } set textureSize(size: ReadonlyVec2 | null) { - const old = this.#textureSize; - if (size === old || (size && old && vec2.exactEquals(size, old))) return; + if (sameSize(size, this.#textureSize)) return; this.#textureSize = size && vec2.clone(size); this.#fit(); this.#updateContent(); } + get #size(): ReadonlyVec2 | null { + return this.#textureSize ?? this.#measuredSize; + } + + static { + measurePolygon = (polygon, size) => polygon.#measure(size); + } + + #measure(size: ReadonlyVec2 | null): void { + if (sameSize(size, this.#measuredSize)) return; + this.#measuredSize = size && vec2.clone(size); + if (this.#textureSize) return; + this.#fit(); + this.#updateContent(); + } + // The devicePixelRatio, update it after zoom or a screen change get pixelRatio(): number { return this.#pixelRatio; @@ -236,7 +261,7 @@ export class Polygon extends Object3D { set pixelRatio(ratio: number) { if (ratio === this.#pixelRatio) return; this.#pixelRatio = ratio; - if (!this.#textureSize) return; + if (!this.#size) return; this.#fit(); this.#updateContent(); } @@ -339,10 +364,11 @@ export class Polygon extends Object3D { // Texels per world unit in the most stretched direction #texelDensity(tri: Triangle): number { - if (!this.#textureSize) return 0; + const size = this.#size; + if (!size) return 0; const M = uvTransform(this.vertices, tri.norm); if (!M) return 0; - const [sx, sy] = vec2.mul(vec2.create(), this.#uvScale, this.#textureSize); + const [sx, sy] = vec2.mul(vec2.create(), this.#uvScale, size); const L = mat2.fromValues(M[0] * sx, M[1] * sy, M[3] * sx, M[4] * sy); // Largest singular value, from σ1² + σ2² = frob² and σ1·σ2 = |det| const frob2 = mat2.frob(L) ** 2; diff --git a/packages/c3r/test/c3r.test.ts b/packages/c3r/test/c3r.test.ts index bf0b253..1b6dd2f 100644 --- a/packages/c3r/test/c3r.test.ts +++ b/packages/c3r/test/c3r.test.ts @@ -535,7 +535,7 @@ describe("Material", () => { const group = new Group(); { using material = new Material(); - material.backgroundColor = [1, 0, 0, 1]; + material.background = [1, 0, 0, 1]; group.material = material; expect(group.domElement.classList).toContain(material.className); @@ -567,10 +567,10 @@ describe("Material", () => { expect(rule()).not.toContain("backface-visibility"); }); - it("masks a tint to the image in effect", () => { + it("paints a color or an image, hiding the other from a parent", () => { using material = new Material(); const vars = () => - ["--c3r-background-color", "--c3r-mask-image"].map( + ["--c3r-background-color", "--c3r-background-image"].map( (name) => new RegExp(`${name}: ?([^;]+)`).exec( ruleOf(material.className), @@ -578,15 +578,39 @@ describe("Material", () => { ); expect(vars()).toEqual([null, null]); - material.backgroundImageSrc = "leaf.png"; - expect(vars()).toEqual(["transparent", "none"]); - material.backgroundColor = [1, 0, 0, 1]; + material.background = "leaf.png"; + expect(vars()).toEqual(["transparent", 'url("leaf.png")']); + material.background = [1, 0, 0, 1]; expect(vars()[0]).toMatch(/rgba\(255, ?0, ?0, ?1\)/); - expect(vars()[1]).toBe("var(--c3r-background-image, none)"); - material.backgroundImageSrc = null; - expect(vars()[1]).toBe("var(--c3r-background-image, none)"); - material.backgroundColor = null; + expect(vars()[1]).toBe("none"); + material.background = ""; expect(vars()).toEqual([null, null]); + expect(material.background).toBe(null); + }); + + it("paints a color opaque and fades it, so a tint stays exact", () => { + using material = new Material(); + const rule = () => ruleOf(material.className); + material.background = [1, 0, 0, 0.5]; + expect(rule()).toMatch(/--c3r-background-opaque: ?rgb\(255, ?0, ?0\)/); + expect(rule()).toMatch(/--c3r-background-alpha: ?0\.5/); + expect(rule()).toMatch(/--c3r-alpha-mask: ?none/); + }); + + it("keeps an image's mask when it can't read the pixels", async () => { + using material = new Material(); + material.background = "leaf.png"; + const container = new Container(); + container.root.material = material; + container.root.addPolygon([ + vertex(0, 0, 0), + vertex(1, 0, 0), + vertex(0, 1, 0), + ]); + await container.bake(); + expect(ruleOf(material.className)).toContain( + '--c3r-alpha-mask: url("leaf.png")', + ); }); it("filters with Filter steps only", () => { @@ -604,6 +628,30 @@ describe("Material", () => { TypeError, ); }); + + it("tints by a multiplied color layer, replacing a parent's filters", () => { + using material = new Material(); + const rule = () => ruleOf(material.className); + material.filter = [Filter.tint([1, 0.8, 0.6]), Filter.opacity(0.5)]; + expect(rule()).toContain( + "--c3r-layers: linear-gradient(rgb(100% 80% 60%), rgb(100% 80% 60%)),", + ); + expect(rule()).toContain("--c3r-layered: alpha"); + expect(rule()).toContain("--c3r-filter: opacity(0.5)"); + // Only the tint changes, which must not be skipped + material.filter = [Filter.tint([0, 0, 1]), Filter.opacity(0.5)]; + expect(rule()).toContain("rgb(0% 0% 100%)"); + // A tint alone still hides the parent's filters + material.filter = Filter.tint([0, 0, 1]); + expect(rule()).toContain("--c3r-filter: initial"); + material.filter = Filter.sepia(1); + expect(rule()).toMatch(/--c3r-layers: initial;.*--c3r-layered: initial/); + material.filter = null; + expect(rule()).not.toMatch(/--c3r-(filter|layer)/); + + expect(() => Filter.tint([1, 0, 1.5])).toThrow(RangeError); + expect(() => Filter.tint([NaN, 0, 0])).toThrow(RangeError); + }); }); describe("Tween", () => { @@ -813,7 +861,7 @@ describe("Tween", () => { expect(() => Transform.scale([1, 1] as never)).toThrow(RangeError); expect(() => Transform.rotateY(Infinity)).toThrow(RangeError); expect(() => Filter.brightness(-1)).toThrow(RangeError); - expect(() => Filter.blur(NaN)).toThrow(RangeError); + expect(() => Filter.sepia(NaN)).toThrow(RangeError); expect( () => new Tween({ keyframes: [[Filter.sepia(1), Filter.sepia(0.5)]] }), ).toThrow(RangeError); @@ -846,15 +894,15 @@ describe("Tween", () => { it("chains filters in order, each through its own property", () => { using look = new Tween({ keyframes: [ - [Filter.brightness(2), Filter.hueRotate(turn), Filter.blur(3)], + [Filter.brightness(2), Filter.hueRotate(turn), Filter.sepia(0.5)], ], }); const p = `--${look.className}`; expect(cssText()).toContain( - `0% { ${p}-brightness: 1; ${p}-hue-rotate: 0rad; ${p}-blur: 0px; }`, + `0% { ${p}-brightness: 1; ${p}-hue-rotate: 0rad; ${p}-sepia: 0; }`, ); expect(cssText()).toContain( - `100% { ${p}-brightness: 2; ${p}-hue-rotate: ${turn}rad; ${p}-blur: 3px; }`, + `100% { ${p}-brightness: 2; ${p}-hue-rotate: ${turn}rad; ${p}-sepia: 0.5; }`, ); expect(cssText()).toContain( `@property ${p}-hue-rotate { syntax: ""; inherits: false; initial-value: 0rad; }`, @@ -862,8 +910,34 @@ describe("Tween", () => { const group = new Group(); group.tween = look; expect(group.domElement.style.getPropertyValue("--c3r-tween-filter")).toBe( - `brightness(var(${p}-brightness, 1)) hue-rotate(var(${p}-hue-rotate, 0rad)) blur(var(${p}-blur, 0px))`, + `brightness(var(${p}-brightness, 1)) hue-rotate(var(${p}-hue-rotate, 0rad)) sepia(var(${p}-sepia, 0))`, + ); + }); + + it("tweens a tint as one color, with any easing or hover", () => { + using change = new Tween({ + keyframes: [Filter.tint([1, 0.8, 0.6])], + easing: "ease", + }); + const p = `--${change.className}-tint`; + expect(cssText()).toMatch( + new RegExp(`@property ${p} ?\{ ?syntax: ?""`), ); + expect(cssText()).toContain(`${p}: rgb(100% 80% 60%)`); + const group = new Group(); + group.tween = change; + const { style } = group.domElement; + expect(style.getPropertyValue("--c3r-tween-layers")).toBe( + `linear-gradient(var(${p}, white), var(${p}, white)),`, + ); + expect(style.getPropertyValue("--c3r-tween-filter")).toBe("initial"); + group.tween = null; + expect(style.getPropertyValue("--c3r-tween-layers")).toBe(""); + expect(() => + new Tween({ keyframes: [Filter.tint([0, 0, 1])], hover: true })[ + Symbol.dispose + ](), + ).not.toThrow(); }); }); @@ -873,14 +947,14 @@ describe("server-side rendering", () => { expect(cssText()).toContain("@property --c3r-matrix"); }); - it("exports the scene as static html", () => { + it("exports the scene as static html", async () => { const container = new Container(); const group = new Group(); group.matrix = mat4.fromScaling(mat4.create(), [0.01, 0.01, 0.01]); group.addPolygon([vertex(0, 0, 0), vertex(1, 0, 0), vertex(0, 1, 0)]); container.root.addChild(group); - const html = container.toHTML(); + const html = await container.toHTML(); const { outerHTML } = container.domElement; const css = cssText().replaceAll("<", "\\3c "); @@ -888,17 +962,17 @@ describe("server-side rendering", () => { expect(outerHTML).toContain("--c3r-unit-scale"); }); - it("keeps every value inside the exported style element", () => { + it("keeps every value inside the exported style element", async () => { const container = new Container(); const group = new Group(); group.material = new Material(); - group.material.backgroundImageSrc = "a"; + group.material.background = "a"; container.root.addChild(group); - expect(container.toHTML()).not.toContain(" + ``` It bundles gl-matrix and exposes a `C3R` global. diff --git a/packages/c3r/package.json b/packages/c3r/package.json index 9a4cefa..00b670a 100644 --- a/packages/c3r/package.json +++ b/packages/c3r/package.json @@ -1,6 +1,6 @@ { "name": "c3r", - "version": "0.2.1", + "version": "0.3.0", "description": "CSS 3D Renderer", "keywords": [ "typescript", From 209fcf116aae6bb5552d8103ebe6be1fb8adee9c Mon Sep 17 00:00:00 2001 From: K-Adam Date: Thu, 29 Oct 2026 18:21:33 +0100 Subject: [PATCH 11/13] Restyle examples index with Pico CSS and drop sprites2 example --- examples/index.html | 206 +++++++++++------------ examples/package.json | 1 + examples/public/textures/sprite0.png | Bin 6885 -> 0 bytes examples/public/textures/sprite1.png | Bin 7349 -> 0 bytes examples/public/textures/sprite2.png | Bin 4841 -> 0 bytes examples/three_sprites2.html | 242 --------------------------- package-lock.json | 8 + 7 files changed, 106 insertions(+), 351 deletions(-) delete mode 100644 examples/public/textures/sprite0.png delete mode 100644 examples/public/textures/sprite1.png delete mode 100644 examples/public/textures/sprite2.png delete mode 100644 examples/three_sprites2.html diff --git a/examples/index.html b/examples/index.html index a6f905c..a83d59c 100644 --- a/examples/index.html +++ b/examples/index.html @@ -3,136 +3,124 @@ - c3r examples + CSS 3D examples -

c3r examples

+
-
- -
+ .github-corner .octo-arm { + animation: octocat-wave 560ms ease-in-out; + } + } + diff --git a/examples/package.json b/examples/package.json index 21ffe03..1c07a61 100644 --- a/examples/package.json +++ b/examples/package.json @@ -7,6 +7,7 @@ "build": "vite build" }, "devDependencies": { + "@picocss/pico": "^2.1.1", "gl-matrix": "^3.4.4", "nipplejs": "^1.0.4", "primitive-geometry": "^3.3.1", diff --git a/examples/public/textures/sprite0.png b/examples/public/textures/sprite0.png deleted file mode 100644 index 35538a64540bec63f4a10bcdbaf5549577f0917e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6885 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 Z;3kIsa`p8e0e^lx>1r8jmZ@W7{tM%!U|j$J diff --git a/examples/public/textures/sprite1.png b/examples/public/textures/sprite1.png deleted file mode 100644 index d78fbbe3ea394b57f06ba087c663ef19d2cac903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7349 zcmaKRXH*o;+U?AchMcp&kOU;>oQEhNNpglENEn2XBw@%o3W9)wfS@8#K#(*B`;K|K1knfcy)B@KogZ zpQJ4G4I%1qKNv((NJP+CL`noAB`PE;E+H)~EdUV{5fu>@5fc^_6BLz}6Bm;c5rO>s z;JA(E=i(}74AuO1tlO3%hdTn{D<>=*7#JuNC@uu|a}ySom6iRgAtokxixBh=_CYuX z3HtbR{-Xee`8)f0_#!;uK9IkPj!y6=2t|(DO#i0~-oF2l_3{7rFx?KAaFC;~u&9v8 z-!AQ8aXiBjEn-a9@bJi6lhd(b>c2Z~I?(eSJ9{AAf|Sk26dMs>pGxAmriUBBv@N zE29RLkd~B@6cZKI5K$GCl2I2Em(~=Ql#*5z)BJ}Eg*!j-hWQ}=;kx`USLVNR|60M@ z_ck&V=I0RrbJ6sJdqe)!WjT-ko{Qvv)%!Qs<-g}5^z=>W z|Je4n@gL*Ed~V(DcWdixZgj%!isI9Os+tDP?${D~*?bAUIfdlfES~8na=>)5U2Mw* zt(9B`|FE!WXO^o{Ndu|Me2j~|x9NaUcb`~G2tA_FNxsWB+Dp2E?`=C5Nv`21Fq0)X zD5p2}9BRv@ahMfU^z?Dd^~Pg1@jKt!Z1?)Kwysg=U7^9V=A$sIY%ZyE(KJaoUA^4u z`h`IgLl?Ovt_U`;mK*&vZspu-CgBJlFn>4LTm1Y5CA(VIRHl;kq)V+}57s2qo7(Q1 zl1XMaxHn_1aqKCrr2ugT01Y#*o8fGuC+u1hE(6$4x^i5FTDA~wh>Zo%)&}gg+m5?H zYxzDP!8a)f`Ed3=jJ6Bd5;uW0C@1b?Wi-xAmn}o4rJo8TZ zC$PaY9AVIAhD626wjqV8Cddx+u=s&L>H&YXf~X5!Hv;OLj~mK~)+nCnu6a4{c_ZF2 zm{9D8BQ~51{BEW4_*a28xPUPcEx~tC5_hCh5nprZc@vf&L&8CLypces!lhyeL6S)< zT_t&6Q4lq26q3_jef@JQ(;FwJOtS+=x>k)ER~VJA`~v~SIA?? zLs=~G##ue}-3^kjK1p*3{Sp0cSw}CnYqH?MV^VD}Wp;Bs#nhMAxW{!D0!ZAT0#Fbo zf__S@TmPv(+Ld}B*puIIyn#saV+Km}!zWgo7rQ9>O z&=C9@O_IqG<8UswTBPX^MC3fBDH;R=Oy$du1(&can8%BZFQ#XzP}p5sw_h|@K2XKC zY%5+Kx#Xkd($;0?H6wN?KDme1K#8AJ%ClHjeltS2;k@7Pz^j~kSlm<(cq7X=z%d+< z#jSns-Jmh9Lijm8kBFMf=0yYZ%l%h-Fs12f` z2Ah6wD*2LCV1M)GD>ut%#ppy*lxR@k^yS%fXHlsDJEFfWPvBye2;>@fc1YGTo20L9 zSll1IS9kUhO0odZ+gGc93NSZLm{Rek9jl7EDHyUuhvDGr@Q4H?R|xGM2Ql`k$`?728pbXOVl-ksW8QI++khk6$ya z4ebF`U&0UBtv<)8eCTP80f*EMRHP=S5kHRs5FN09&KW@mGbEuz2SlAs)CI~B1beTu ztJ93@&%;8y@Qar#QC~+!9)6uEef+hy9FFshuk+(SQl)e{y}v=W^r zLI~vu!tQENJMdMv1U@9ZXRnl`t{hI!W`gE56G+9ca;37B3%E-e zy13-#*YOHi^lf%u(sB3Gsl(ZBWo;%0<~Rm7Nb&(tUwHhPS#My?kRQibU_wW*%C{qE z)N%|$#^1BxQC+zLIrr~-hKJqOLFvW=tbKX0L%JiIR<9DGj7pO3-aEJeE6bCFv%a`0 zfzPLV+jlUx!uhlWD<`>eum0Ggn&?*u?CI%*KU~~pbgCaOx`DjjD;6M+Eo#MS<^N-J z9xYv01nT=1g(u=SM#vc{4xAO%#M~NiVM@Ge#M&~YzB7pCOsSDH(B!>&el6>8HI9^m z7ER>?uPAs$P5rv1!||Qbo64BQ*_UY~L_q}>nZLC#b?L_a;$4hAiTtmj&rmN^4tAqP zHo8WftLlgzF5NDXpdijBdYESsx8|MW=A5EZ?T80{?-i<@98RVpBhz_ZJnwH-S#DiQ z=>}r|h`MAw9JrYZ^qprm1PQ;aVHi1&6erBzryA9p@-*u*j$)-Bb5Rr$bUga=PO0tAN4(lE z;EoTYJryB7i#y^6oo5oKTzH{(1-`g(X_wdT6mL_O1X%j{z@w`=Xd3NX2*_`?dYXG2 zr^HIyeCM-cmq-(~4u7^GGkdsOZv8L)^{5e<9@X}BLpeE~bs?rT3#7z9nYcs0V+p${Q5vb=t<$n{<;hlYxL>2tMGjEng20z zzx6@ZNGI*wGf)Se&O;vB?BFarm8D0!Uj3O+stoS87yUvCy-CiFRBJJU@8$KP5E{FH zWbR1kOe^we1pL)Z#XwUGsuR04=L?Ut#t6t7H{iX+fS$z5OL8&D;@Bud?E>ZAaTP;k zJDb24oF)u%6RAc6ZhTr+=@|zQL%Q=py$GSYK>qtDL?5Xbb}Km$)!-C9p5RqBn?h-6BPompmnv^2ZY?9SCO3HF5vFJv0YDD*hnEH#u^5bBy{)y{U_mDlK9f;bdWu&~s=h6fwz=*79;b+2C3W*=vq$wg9Wvj7$N!dZ#mie;Wiv`h%kC-&Fo46kcv2$jWZ zRu<9e0}8ly{T*(~$ZRnmixyG^$-R47dS{QbPrm0};Rs!887GTx zhBI%55!@H_Lc2dzlrmOnj`YU~71@kAoxbbk{b77tAS76Z^Le%i6EQ>_%LMcj&%~^mdAWKX zK5sKu2t&P~M|Q0yw%158C+y7y0$j65f4T?x5l`wq0=3a5xD(zna_{ttOE=rcM$6Y7 z-Vb!7r)2*|)81WjESfYW%;;~=Lw=e31cxZ*O1AEk5=6b z*9I8j!6mGsha#oJmGPr53{Ky`ULFQALbg3QlXkUz#7Yb`qBfB4U`u3kxIJf2J`qhF z_bi{_MSpfH#!X+gaf@3b-`;H!)^U++43?M|eJ0zc1#29vZU_@mTZ9ZR94fDf7r zl{}Aue;Cz6Aq-Xmz%upD?D)waw53in$5~Bagl`k+%l=d@uek#6C+-%ODb6f74Af%4 zcn)eXbAajG!OSL+4L$6HX#`a+KkH_ju9x<12ONRtm_3{&&3@2% zl*VisH3O}==pAw`kP=O_b4@vK2kVA9x5_?K!1SN+<|6kKCh=63LF@H^uNMoqi{RCs z#q$l4`B7uECRxh{RV1K3t2P@T6%FzA;i>8NYMxOFHHg>o#}-&vsQPG#CW%ITG1V%Q zf#lx;n5Hl9(G)nLzhuSYu^8(n0d;v91k5Y|tb1BIf^;hwBAN~H0z z8g%iVJtNLr?c#+P?`@Tieh#EgY%1CFwMQT8otpq9HF<7$(?m<$FE3$Zote;OLajgazcf-mxe=t4*?&mo9LgXv* zP*#W17I_}>ovK-{`Ti&FBkq*U;o{*QYcs-_DBRiN=%0P-&qXvf#Us5l$5q~N*LMBE zy3!Z4tyFMzmjFl?9JDHy66!5dcD6ABK~*oSVNdE>ZY8!ee&aFBaU<2wS6ilb+$AfM zhXrqno1|2lTFUfVBthDZw%x@U!hoWmeRrj>FYX(x9c7=fLyG z>h`H)MGhr!dKRgz^@FLJ*pRhMK_*i48z|3wnh%DvI=l5oHI^2ciD!6$Z7DcOb;=V! z(&FWr-VK}W%DK*qIJOz(B@?L!v|WtSF~8c?WRusP*?#2zb%5)xQb);4LW!wyQ47y)UAuYe4& z$h5N3C+mc5mp{RKb`J>)DM2c!05ATm@2WQBxK&BTGcN8_t1LLPiDjDdu~1svKi*`a zlW{!D9xX{i=?^I-UfQtrP+VY@-lo4v=fejRaUHzeRH1*v#A%jWpk?9OPxkIEXyBAc zOwI(d4H2Q}s4E&zS?0&ttXlyb4df9#D?%)9XGbh5sRDJFz@=JONjfQS(hP32w9 zieLD8up0s$Oe;kn<#F<3paLO+80{?Zw39YhP}+g%NZG%Md6&St@ycEU@TO6Ui6q|~ zcSRemI2rfKU(wx-{1e1tWitZg%x2TuM_408v`H+@2;?Bce^(D!z&k%7K#)4F9pE*j z4euFx3{vUJ_c>!mkT2bSQwpf`l0dTX&DE{f{QMyo5Y#?u;J7Ry$Ndw!8x!t6i7vouQGXHFKSPp(ylN08V@+d zMF&fx3BNo1$)R@NVi+xXaNk&9LKRo}QBO-)QE@aUp!1=Z2qhhAl&I|~o%xb%^n@Kh zw_Xc^?Dg4Hg>U{mpa3YrT?e2%BTR!LwSAC^h(G39W1$`NFX_16QDY^_`M~htQpVgK znFBf%Npi?K#L$fVAdXE=gHN0OSMhLmT#$gfG3Q!9EA~t#UkCGrc6J04(d!I^B;p|W z(PLGpZ(5_FO&gfp0#`OoU3Vb z^?Kh~=A0ak#?kGXks&F_mu4TkDMn+|4=Ge&cx80UUm;hrjCnJr(K$1Wli^W`*{j|% zM^iN`-u0jXSi{Y&rm6u!S zql-=@9NzZ>%8L++j3WLIwm7QO-_M+aY`Onl5s^&SddYt(hIBm`JUpASpE)5j4 z`BsSdAtvmR8bwpL&snK%m*DI!uN`efP|`-=GYg;FZkF% z5e>{wZ#VN@j-S$Ajg?-v7oizmT;uS_H@rR>^DQuhUL7SV)+zFWzB_k^BlgE7kK?Yd^D_1ZqdHy$b*0aNe5(QY zv~ThJiS3l4o>!_fU_Qo+eD-H)s`K82OQ9_Ve#j>5<)*JdBC+h2k*Z`@ghOoG4~LJE ztyd;Hcy$1xz6uCdRi~?I|MZp1iMiU+CU8zuL76eC|5$meJNRn`+071x6_?crCiJHO zTW{rc{T(H$>1}4kQUyRp3lr-O2C3ajHY^-BB5hl!l{TUp{WmR2|TW{GvL376ddqrXJ(o1VeI$-&fK)TrD zA>VtShG@R&?3M}h$IHs(tE2bh58uH{D?ub|saHEhetk53G&Ax3=c-h$dH<53Nnq zlTq!udWMTuCZpDObdt>P4XsUL>O-adEZZ^!q`QVNqg?%$Uqlfd^tNuF8^eM>pGG7J zC2d#W7PnJ*(@Xmr?=4e5D1+;QppK+ajszE9LVce2N)EOb7uv74pIP|i)n2|V85U4C zlM`DIa#?qQaB`9g1ysMHl(l&Bovl{_xa-F0?{!ybF8ql*XtkY_VTY+7odYB({2aBo z>OC6}Y$t>~dhGBUiNPJk5m_9NWyfQkpi)r>fsC zy$8|MBeDe4?F{bD@7S~>cxe7&kdzZ09;1>AQRPF)x`(j*T2oIm?PQ*61UU%48ttH_T}CCdpTF9GNHu0 zcFD-2;t?>HwI6y|4e6ffKn*}>YqPh0O*71;RC!{kX;_P|iZ?m|nl6bbqI~sn4ONf| z(1aoZ`L^Rwr)h5URux`t8)OphiX;ObnjHtF?z-bEPOa+72>lI_7qKiqk-`J^T0ppf zl1#M^QSn2IV;1W!8I(P7ylIB!&7c<#!5X8!CY~5SZWRd^WMtf2vEA%lP5=!`6ZCWj z*-=PHkw}sNXc~*6E5(tZjMX6*JTvGeRm1=3mV8}32DtN?Qhra9J7#P@)`<&G05os0 hgekZFbc_X&0QSsMCMr@V2mk&^)X^}2R;xKg{U5NSOnv|W diff --git a/examples/public/textures/sprite2.png b/examples/public/textures/sprite2.png deleted file mode 100644 index a1202d2c250b58f2bf2c0e3fb60fcfda13e6949f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4841 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 - - - - - c3r - Sprites 2 - - - -
- three.js - - sprites. -
- - - - diff --git a/package-lock.json b/package-lock.json index 6eef6dd..45b383e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "examples": { "name": "c3r-examples", "devDependencies": { + "@picocss/pico": "^2.1.1", "gl-matrix": "^3.4.4", "nipplejs": "^1.0.4", "primitive-geometry": "^3.3.1", @@ -102,6 +103,13 @@ "url": "https://github.com/sponsors/oxc-project" } }, + "node_modules/@picocss/pico": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@picocss/pico/-/pico-2.1.1.tgz", + "integrity": "sha512-kIDugA7Ps4U+2BHxiNHmvgPIQDWPDU4IeU6TNRdvXQM1uZX+FibqDQT2xUOnnO2yq/LUHcwnGlu1hvf4KfXnMg==", + "dev": true, + "license": "MIT" + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", From f60c7874c79197237e86f2a3ae9fbfd8d6bf1215 Mon Sep 17 00:00:00 2001 From: K-Adam Date: Thu, 29 Oct 2026 19:46:58 +0100 Subject: [PATCH 12/13] Replace canvas material port with a drawable canvas cube --- examples/canvas.html | 109 +++++++++++++++ examples/index.html | 4 +- examples/three_materials_texture_canvas.html | 138 ------------------- 3 files changed, 110 insertions(+), 141 deletions(-) create mode 100644 examples/canvas.html delete mode 100644 examples/three_materials_texture_canvas.html diff --git a/examples/canvas.html b/examples/canvas.html new file mode 100644 index 0000000..630639a --- /dev/null +++ b/examples/canvas.html @@ -0,0 +1,109 @@ + + + + + + c3r - Drawable canvas cube + + + +
Each face is a canvas element, draw on them
+ + + diff --git a/examples/index.html b/examples/index.html index a83d59c..061561b 100644 --- a/examples/index.html +++ b/examples/index.html @@ -43,6 +43,7 @@

Standalone

Ported three.js examples

@@ -53,9 +54,6 @@

Ported three.js examples

  • Interactive cubes
  • -
  • - Canvas material -
  • Periodic table
  • Sprites
  • FPS
  • diff --git a/examples/three_materials_texture_canvas.html b/examples/three_materials_texture_canvas.html deleted file mode 100644 index 9000a8f..0000000 --- a/examples/three_materials_texture_canvas.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - c3r - Canvas material - - - -
    - three.js - - canvas as a texture. Draw in the white box. -
    - - - - - From 35029fa324de9921f8c87be96fb1f81a72a76bc2 Mon Sep 17 00:00:00 2001 From: K-Adam Date: Thu, 29 Oct 2026 21:28:40 +0100 Subject: [PATCH 13/13] Add toHTML to C3RRenderer, load images in Node and reject zero camera scales --- examples/node-render.mjs | 37 +++++++++-------- packages/c3r-three/README.md | 6 ++- packages/c3r-three/src/C3RRenderer.ts | 8 +++- packages/c3r-three/test/C3RRenderer.test.ts | 25 +++++++++++- packages/c3r/README.md | 34 ++++++++++------ packages/c3r/src/C3R.ts | 2 +- packages/c3r/src/css/Transform.ts | 9 +++-- packages/c3r/src/css/Tween.ts | 13 ++++-- packages/c3r/src/css/images.ts | 6 +++ packages/c3r/src/css/steps.ts | 4 +- packages/c3r/src/css/styles.ts | 4 ++ packages/c3r/src/dom/Container.ts | 6 +-- packages/c3r/test/c3r.test.ts | 45 ++++++++++++++++++++- 13 files changed, 147 insertions(+), 52 deletions(-) diff --git a/examples/node-render.mjs b/examples/node-render.mjs index 0eab8e7..e1345fe 100644 --- a/examples/node-render.mjs +++ b/examples/node-render.mjs @@ -1,24 +1,26 @@ // Prints a static HTML render, after `npm run build`: node examples/node-render.mjs > examples/static.html import { GlobalRegistrator } from "@happy-dom/global-registrator"; -GlobalRegistrator.register(); +GlobalRegistrator.register({ + url: "http://localhost/", + settings: { + enableImageFileLoading: true, + fetch: { + virtualServers: [{ url: "/", directory: import.meta.dirname }], + }, + }, +}); const THREE = await import("three"); const { C3RRenderer } = await import("c3r-three"); -const { cssText } = await import("c3r"); - -const width = 800; -const height = 600; const scene = new THREE.Scene(); -const camera = new THREE.PerspectiveCamera(70, width / height, 1, 1000); +// Aspect unused, the view follows the window +const camera = new THREE.PerspectiveCamera(70, 1, 1, 1000); camera.position.z = 500; -// TextureLoader needs a browser -const texture = new THREE.Texture( - Object.assign(document.createElement("img"), { - src: "public/textures/crate.gif", - }), +const texture = await new THREE.TextureLoader().loadAsync( + "public/textures/crate.gif", ); const cube = new THREE.Mesh( new THREE.BoxGeometry(200, 200, 200), @@ -28,16 +30,13 @@ cube.rotation.set(0.4, 0.6, 0); scene.add(cube); const renderer = new C3RRenderer(); -renderer.setSize(width, height); renderer.render(scene, camera); +// Without head and body tags the style lands in the head process.stdout.write(` - - - C3R static render - - - ${renderer.domElement.outerHTML} - + +C3R static render + +${await renderer.toHTML()} `); diff --git a/packages/c3r-three/README.md b/packages/c3r-three/README.md index 798ef56..0e26129 100644 --- a/packages/c3r-three/README.md +++ b/packages/c3r-three/README.md @@ -20,14 +20,16 @@ document.body.appendChild(renderer.domElement); renderer.render(scene, camera); ``` +Until `setSize()` the scenes fill the window and follow it, like a C3R `Container`. An orthographic camera needs `setSize()`. + `CSS3DObject` and `CSS3DSprite` are re-exported from `three/addons`, so their elements receive pointer events as with three's renderer. -Perspective and orthographic cameras are supported, including `zoom`. Material `color`, `map` (image or canvas, with `repeat` and `offset`, its alpha always; a `color` tints it with `Filter.tint`), `opacity` (when `transparent`) and `side` (`BackSide` shows both sides) are applied, and a material's style is removed on its `dispose()`. `renderer.dispose()` removes every rendered scene. +Perspective and orthographic cameras are supported, including `zoom`. Material `color`, `map` (image or canvas, with `repeat` and `offset`, its alpha always; a `color` tints it with `Filter.tint`), `opacity` (when `transparent`) and `side` (`BackSide` shows both sides) are applied, and a material's style is removed on its `dispose()`. `renderer.dispose()` removes every rendered scene, and `renderer.toHTML()` (async) exports them. Not supported yet: `ImageBitmap` maps such as GLTFLoader's, `flipY: false`, and map `rotation` and `center`. ## Node -Set up a DOM and inline `cssText()` as described in [c3r](../c3r/README.md#node), then render and serialize `renderer.domElement.outerHTML`. `TextureLoader` needs a browser, so set the image directly: `new Texture(Object.assign(document.createElement("img"), { src }))`. See [node-render.mjs](../../examples/node-render.mjs). +Set up a DOM with image loading as described in [c3r](../c3r/README.md#node), render, then export with `await renderer.toHTML()`. See [node-render.mjs](../../examples/node-render.mjs). See the [examples](https://k-adam.github.io/CSS3D-Renderer/). diff --git a/packages/c3r-three/src/C3RRenderer.ts b/packages/c3r-three/src/C3RRenderer.ts index df420b9..711ca0e 100644 --- a/packages/c3r-three/src/C3RRenderer.ts +++ b/packages/c3r-three/src/C3RRenderer.ts @@ -116,6 +116,11 @@ export class C3RRenderer { void container.bake(); } + async toHTML(): Promise { + await Promise.all([...this.#containers.values()].map((c) => c.bake())); + return C3R.styleHTML() + this.domElement.outerHTML; + } + #syncCamera(container: C3R.Container, camera: Camera): void { const c = container.camera; @@ -342,7 +347,8 @@ export class C3RRenderer { const image: unknown = map?.image; let src: string | null = null; if (image instanceof HTMLImageElement) { - src = image.src; + // As written, a server-side DOM resolves it against its own origin + src = image.getAttribute("src") ?? image.src; } else if (image instanceof HTMLCanvasElement && map) { if (state.map !== map || state.version !== map.version) { state.canvasSrc = image.toDataURL(); diff --git a/packages/c3r-three/test/C3RRenderer.test.ts b/packages/c3r-three/test/C3RRenderer.test.ts index 66691be..198f083 100644 --- a/packages/c3r-three/test/C3RRenderer.test.ts +++ b/packages/c3r-three/test/C3RRenderer.test.ts @@ -14,7 +14,7 @@ import { Texture, Vector3, } from "three"; -import { cssText } from "c3r"; +import { cssText, styleHTML } from "c3r"; import { C3RRenderer, CSS3DObject } from "../src/C3RRenderer.js"; const materialRule = (element: Element) => { @@ -202,6 +202,7 @@ it("tints a map by its color", () => { renderer.render(scene, camera); expect(rule()).toMatch(/--c3r-filter: ?opacity\(0\.4\)/); expect(rule()).toMatch(/--c3r-layers: ?linear-gradient/); + expect(rule()).toContain('url("crate.png")'); material.dispose(); }); @@ -326,6 +327,28 @@ it("removes the scenes and camera rules on dispose", () => { expect(renderer.domElement.children).toHaveLength(1); }); +it("fills the window until setSize()", () => { + const { scene, camera } = setup(); + const renderer = new C3RRenderer(); + renderer.render(scene, camera); + const container = renderer.domElement.firstElementChild as HTMLElement; + const viewport = () => + container.style.getPropertyValue("--c3r-viewport-height"); + expect(renderer.domElement.style.height).toBe(""); + expect(viewport()).toBe(""); + + renderer.setSize(400, 300); + expect(viewport()).toBe("300px"); +}); + +it("exports the scenes as static html", async () => { + const { renderer, scene, camera } = setup(); + renderer.render(scene, camera); + const html = await renderer.toHTML(); + expect(html).toBe(styleHTML() + renderer.domElement.outerHTML); + expect(html).toContain("c3r-container"); +}); + it("scales the view by its densest polygon, flat faces stay small", () => { const { renderer, scene, camera } = setup(); const mesh = new Mesh( diff --git a/packages/c3r/README.md b/packages/c3r/README.md index 2f9b3a2..07a5789 100644 --- a/packages/c3r/README.md +++ b/packages/c3r/README.md @@ -44,16 +44,16 @@ box.material.background = "crate.jpg"; container.camera.matrix = mat4.fromTranslation(mat4.create(), [0, 0, 400]); ``` -| Class | What it is | -| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `unitScale`, `bake()` fits it, `toHTML()` (async) | -| `Group` | A transformed node: `matrix`, `tween` (one or an array), `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | -| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset`, `textureSize` (set it for a data url, otherwise `bake()` measures it) | -| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | -| `Tween` | A CSS animation of a group or camera: `keyframes` of `Transform` and `Filter` steps, `from`, `duration`, `delay`, `easing`, `loop`, `alternate`, `paused`, `hover` | -| `Transform`, `Filter` | Steps from factories: `translate` (scene units), `rotateX`, `rotateY`, `rotateZ`, `scale`; `opacity`, `brightness`, `contrast`, `saturate`, `grayscale`, `sepia`, `invert`, `hueRotate`, `tint` | -| `Material` | `background` (an rgba color or an image URL), `filter` (one or an array of `Filter` steps, before a tween's), `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | -| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (pose), `viewMatrix` (read-only inverse), `tween`, and `fov`, or `left`, `right`, `top`, `bottom` | +| Class | What it is | +| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Container` | The viewport: `domElement`, `root` group, `camera`, `setSize()`, `unitScale`, `bake()` fits it, `toHTML()` (async) | +| `Group` | A transformed node: `matrix`, `tween` (one or an array), `addChild()`, `addPolygon()`, `addTriangles()` merges into polygons, `addMesh()` takes flat `positions`, `uvs`, `cells` | +| `Polygon` | A flat, convex or concave textured polygon from CCW vertices, with `uvScale`, `uvOffset`, `textureSize` (set it for a data url, otherwise `bake()` measures it) | +| `ElementObject` | Any HTML element in the scene, centered on the origin, with `scale`, `center`, `rotation` | +| `Tween` | A CSS animation of a group or camera: `keyframes` of `Transform` and `Filter` steps, `from`, `duration`, `delay`, `easing`, `loop`, `alternate`, `paused`, `hover` | +| `Transform`, `Filter` | Steps from factories: `translate` (scene units), `rotateX`, `rotateY`, `rotateZ`, `scale`; `opacity`, `brightness`, `contrast`, `saturate`, `grayscale`, `sepia`, `invert`, `hueRotate`, `tint` | +| `Material` | `background` (`[r, g, b, a]` in 0-1, or an image URL), `filter` (one or an array of `Filter` steps, before a tween's), `doubleSided`, inherited by the object's descendants; on an `ElementObject`, its element only | +| `PerspectiveCamera`, `OrthographicCamera` | `matrix` (pose), `viewMatrix` (read-only inverse), `tween`, and `fov`, or `left`, `right`, `top`, `bottom` | An image's alpha shows through. A color and an image don't combine, tint either with `Filter.tint`; a color hides an inherited image and an image hides an inherited color. Every property applies on assignment; there is no `update()` to call. A polygon is laid out from its vertices on construction, so put it in a group to move it. @@ -63,7 +63,7 @@ A tween animates a group after its `matrix`, from rest or from the `from` steps, `Filter.tint(color)` multiplies each pixel by an sRGB color in 0-1, like a sprite tint. It applies to polygons only, before the other filters, and semi-transparent pixels take a slight tint halo. -Aim a camera with `mat4.targetTo(mat4.create(), eye, target, [0, 1, 0])`. Its tween moves it after its `matrix` (`translate([0, 0, 400])` backs away) and can't `hover`; its filters apply to every group without its own, and `bake()` ignores it. +Aim a camera with `mat4.targetTo(mat4.create(), eye, target, [0, 1, 0])`. Its tween moves it after its `matrix` (`translate([0, 0, 400])` backs away) and can't `hover` or scale by zero or less; its filters apply to every group without its own, and `bake()` ignores it. On a live page, call `container.bake()` after building, heavily scaling or changing textures; `toHTML()` awaits it for you. It also sizes polygons to their image's texels, loading each url once. @@ -73,7 +73,9 @@ The stylesheet is adopted by `document` only, so a container inside a shadow roo ## Node -C3R builds plain DOM elements, so it runs on a server-side DOM like [happy-dom](https://github.com/capricorn86/happy-dom). Stylesheets are not serialized, so export with `toHTML()`: the container markup after a ``; diff --git a/packages/c3r/src/dom/Container.ts b/packages/c3r/src/dom/Container.ts index f7db865..0418cba 100644 --- a/packages/c3r/src/dom/Container.ts +++ b/packages/c3r/src/dom/Container.ts @@ -3,7 +3,7 @@ import { mat4, type ReadonlyMat4 } from "gl-matrix"; import type { Camera } from "../css/Camera.js"; import { imageInfo, loadImage } from "../css/images.js"; import { PerspectiveCamera } from "../css/PerspectiveCamera.js"; -import { cssText } from "../css/styles.js"; +import { styleHTML } from "../css/styles.js"; import { ElementObject } from "./ElementObject.js"; import { Group } from "./Group.js"; @@ -135,9 +135,7 @@ export class Container { async toHTML(): Promise { await this.bake(); - // So no value can close the style element - const css = cssText().replaceAll("<", "\\3c "); - return `${this.domElement.outerHTML}`; + return styleHTML() + this.domElement.outerHTML; } setSize(width: number, height: number): void { diff --git a/packages/c3r/test/c3r.test.ts b/packages/c3r/test/c3r.test.ts index 1b6dd2f..0368c44 100644 --- a/packages/c3r/test/c3r.test.ts +++ b/packages/c3r/test/c3r.test.ts @@ -12,6 +12,7 @@ import { OrthographicCamera, PerspectiveCamera, Polygon, + styleHTML, Transform, Tween, type Vertex, @@ -842,6 +843,15 @@ describe("Tween", () => { expect(() => (camera.tween = [move, hover])).toThrow(RangeError); expect(cssText()).not.toContain(`.${hover.className}, .c3r-view`); expect(camera.tween).toEqual([move, grow]); + for (const keyframes of [ + [Transform.scale(0)], + [Transform.scale([1, -1, 1])], + [Transform.scale(-1), Transform.scale(1)], + ]) { + using flat = new Tween({ keyframes }); + expect(() => (camera.tween = flat)).toThrow(RangeError); + } + expect(camera.tween).toEqual([move, grow]); camera.tween = null; expect(rule()).not.toContain("tween"); }); @@ -957,8 +967,7 @@ describe("server-side rendering", () => { const html = await container.toHTML(); const { outerHTML } = container.domElement; - const css = cssText().replaceAll("<", "\\3c "); - expect(html).toBe(`${outerHTML}`); + expect(html).toBe(styleHTML() + outerHTML); expect(outerHTML).toContain("--c3r-unit-scale"); }); @@ -976,6 +985,38 @@ describe("server-side rendering", () => { group.material[Symbol.dispose](); }); + it("measures the images a server-side DOM loads", async () => { + const { settings } = window.happyDOM; + const { enableImageFileLoading } = settings; + const { virtualServers } = settings.fetch; + settings.enableImageFileLoading = true; + settings.fetch.virtualServers = [ + { url: "/assets/", directory: "examples/public" }, + ]; + try { + const container = new Container(); + const [loaded, sized] = [0, 1].map(() => { + const group = new Group(); + container.root.addChild(group); + group.material = new Material(); + group.material.background = "/assets/textures/mountain.jpg"; + return group.addPolygon([ + vertex(0, 0, 0, 0, 0), + vertex(1, 0, 0, 1, 0), + vertex(0, 1, 0, 0, 1), + ]); + }); + sized.textureSize = [768, 256]; + await container.bake(); + const width = (poly: Polygon) => + poly.domElement.style.getPropertyValue("--c3r-width"); + expect(width(loaded)).toBe(width(sized)); + } finally { + settings.enableImageFileLoading = enableImageFileLoading; + settings.fetch.virtualServers = virtualServers; + } + }); + it("sizes an orthographic view from setSize, without layout", () => { const container = new Container(); container.setSize(400, 300);
    +

    CSS 3D examples

    -

    Standalone

    +

    Standalone

    -
    + -

    Ported three.js examples

    +

    Ported three.js examples

    - + +