Shell rendering
This commit is contained in:
parent
05fca4e2e1
commit
fbfdaca8f6
@ -1,4 +1,4 @@
|
|||||||
@REM rmdir dist\
|
@REM rmdir dist\
|
||||||
@REM mkdir dist\public
|
@REM mkdir dist\public
|
||||||
@REM xcopy .\assets .\dist\public /e /h /y /f
|
@REM xcopy .\assets .\dist\public /e /h /y /f
|
||||||
tsc && webpack --config .\webpack\development.js
|
tsc && webpack --config .\webpack\development.js --watch
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { Mesh, MeshImport } from "./mesh";
|
import { Mesh, MeshImport } from "./mesh";
|
||||||
|
import { Canvas } from "./render";
|
||||||
|
|
||||||
|
|
||||||
const request_mesh_handler = (e: ProgressEvent<XMLHttpRequestEventTarget>) => {
|
const request_mesh_handler = (e: ProgressEvent<XMLHttpRequestEventTarget>) => {
|
||||||
@ -14,17 +15,7 @@ const request_mesh_listeners = (xhr: XMLHttpRequest) => {
|
|||||||
xhr.addEventListener("abort", request_mesh_handler);
|
xhr.addEventListener("abort", request_mesh_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
const request_mesh = (filename: string) => {
|
const request_mesh = (request: XMLHttpRequest, filename: string) => {
|
||||||
let request = new XMLHttpRequest();
|
|
||||||
request_mesh_listeners(request);
|
|
||||||
request.onreadystatechange = function() {
|
|
||||||
if (request.readyState == XMLHttpRequest.DONE) {
|
|
||||||
console.log(request.responseText);
|
|
||||||
const mesh = MeshImport.parse(request.responseText);
|
|
||||||
console.log(`Got mesh array at ${mesh.name}`);
|
|
||||||
console.log(mesh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
request.open('GET', `http://localhost:${3000}/mesh/${filename}`, true);
|
request.open('GET', `http://localhost:${3000}/mesh/${filename}`, true);
|
||||||
request.send(null);
|
request.send(null);
|
||||||
return request;
|
return request;
|
||||||
@ -33,5 +24,19 @@ const request_mesh = (filename: string) => {
|
|||||||
// Wait for page load before executing code
|
// Wait for page load before executing code
|
||||||
window.addEventListener('load', function() {
|
window.addEventListener('load', function() {
|
||||||
console.log('PAGE LOADED');
|
console.log('PAGE LOADED');
|
||||||
const req = request_mesh('clover.obj');
|
|
||||||
})
|
const canvas = new Canvas(<HTMLCanvasElement>this.document.getElementById('draw'));
|
||||||
|
const req = new XMLHttpRequest();
|
||||||
|
|
||||||
|
req.onreadystatechange = function() {
|
||||||
|
if (req.readyState == XMLHttpRequest.DONE) {
|
||||||
|
console.log(req.responseText);
|
||||||
|
const mesh = MeshImport.parse(req.responseText);
|
||||||
|
console.log(`Got mesh array at ${mesh.name}`);
|
||||||
|
console.log(mesh);
|
||||||
|
|
||||||
|
canvas.draw_shells(mesh.shells);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
request_mesh(req, 'clover.obj');
|
||||||
|
});
|
||||||
|
@ -5,6 +5,7 @@ class Shell {
|
|||||||
public centerpoint: Vector2 = new Vector2();
|
public centerpoint: Vector2 = new Vector2();
|
||||||
public rotation: number = 0;
|
public rotation: number = 0;
|
||||||
public scale: number = 1.0;
|
public scale: number = 1.0;
|
||||||
|
public path: Path2D = new Path2D();
|
||||||
|
|
||||||
constructor(private triangles: Triangle[]) {
|
constructor(private triangles: Triangle[]) {
|
||||||
}
|
}
|
||||||
@ -47,7 +48,8 @@ class Shell {
|
|||||||
this.triangles.push(t);
|
this.triangles.push(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
public calculate_centerpoint() {
|
public precompute() {
|
||||||
|
// First, calculate centerpoint
|
||||||
let uvs = Triangle.find_unique_uvs(this.triangles);
|
let uvs = Triangle.find_unique_uvs(this.triangles);
|
||||||
|
|
||||||
this.centerpoint = new Vector2();
|
this.centerpoint = new Vector2();
|
||||||
@ -56,9 +58,23 @@ class Shell {
|
|||||||
});
|
});
|
||||||
this.centerpoint = Vector2.Divide(this.centerpoint, uvs.length);
|
this.centerpoint = Vector2.Divide(this.centerpoint, uvs.length);
|
||||||
|
|
||||||
|
// Apply centerpoint to all children
|
||||||
this.triangles.forEach((t: Triangle) => {
|
this.triangles.forEach((t: Triangle) => {
|
||||||
t.set_centerpoint(this.centerpoint);
|
t.set_centerpoint(this.centerpoint);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Now compute strokes
|
||||||
|
this.generate_path();
|
||||||
|
}
|
||||||
|
private generate_path() {
|
||||||
|
this.path = new Path2D();
|
||||||
|
|
||||||
|
this.triangles.forEach((t: Triangle) => {
|
||||||
|
this.path.moveTo(t.uvs[0].x, t.uvs[0].y);
|
||||||
|
this.path.lineTo(t.uvs[1].x, t.uvs[1].y);
|
||||||
|
this.path.lineTo(t.uvs[2].x, t.uvs[2].y);
|
||||||
|
this.path.lineTo(t.uvs[0].x, t.uvs[0].y);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ class MeshImport {
|
|||||||
|
|
||||||
// Finally, calculate shells
|
// Finally, calculate shells
|
||||||
shells.forEach((s: Shell) => {
|
shells.forEach((s: Shell) => {
|
||||||
s.calculate_centerpoint();
|
s.precompute();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Generate corresponding mesh
|
// Generate corresponding mesh
|
||||||
|
41
src/client/render/canvas.ts
Normal file
41
src/client/render/canvas.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { Shell } from '../math';
|
||||||
|
import shell from '../math/shell';
|
||||||
|
|
||||||
|
class Canvas {
|
||||||
|
protected context: CanvasRenderingContext2D;
|
||||||
|
constructor(private element: HTMLCanvasElement) {
|
||||||
|
this.context = <CanvasRenderingContext2D>element.getContext('2d');
|
||||||
|
}
|
||||||
|
|
||||||
|
public clear() {
|
||||||
|
this.context.clearRect(0, 0, this.element.width, this.element.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
private transform_base() {
|
||||||
|
this.context.translate(0, this.element.height);
|
||||||
|
this.context.scale(this.element.width, -this.element.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
public draw_shells(shells: Shell[]) {
|
||||||
|
|
||||||
|
this.context.fillStyle = '#888888';
|
||||||
|
this.context.lineCap = 'round';
|
||||||
|
this.context.lineWidth = 0.0003;
|
||||||
|
this.context.strokeStyle = '#000000';
|
||||||
|
|
||||||
|
shells.forEach((s: Shell) => {
|
||||||
|
this.context.resetTransform();
|
||||||
|
this.transform_base();
|
||||||
|
this.context.rotate(s.rotation);
|
||||||
|
this.context.translate(s.centerpoint.x, s.centerpoint.y);
|
||||||
|
this.context.scale(s.scale, s.scale);
|
||||||
|
|
||||||
|
this.context.fill(s.path);
|
||||||
|
this.context.stroke(s.path);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Canvas drawn");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { Canvas as default };
|
3
src/client/render/index.ts
Normal file
3
src/client/render/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import Canvas from './canvas';
|
||||||
|
|
||||||
|
export { Canvas };
|
Loading…
Reference in New Issue
Block a user