added flat mode, one object, and clear some code
This commit is contained in:
parent
89cb1d7962
commit
4fb99acd00
File diff suppressed because it is too large
Load Diff
|
@ -76,20 +76,16 @@ async function main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec3 n = normalize(vec3(-500., 1000., 500.) - vPosition);
|
vec3 n = normalize(vec3(-50000., 100000., 50000.) - vPosition);
|
||||||
float diffuse = max(dot(vNormal.xyz, n), 0.);
|
float diffuse = max(dot(normalize(vNormal.xyz), n), 0.);
|
||||||
float specular = pow(
|
float specular = pow(
|
||||||
max(dot(
|
max(dot(
|
||||||
reflect(n, vNormal.xyz),
|
reflect(n, normalize(vNormal.xyz)),
|
||||||
normalize(vec3(0., 0., -50.) - vPosition)),
|
normalize(vec3(0., 0., -50.) - vPosition)),
|
||||||
0.), 10.);
|
0.), 10.);
|
||||||
vec3 tmp = extremize(mod(vPosition.xyz + vec3(1000.), vec3(2.)), 2.);
|
vec3 tmp = extremize(mod(vPosition.xyz + vec3(1000.), vec3(2.)), 2.);
|
||||||
float texture = (tmp.x + tmp.y + tmp.z) / 6.;
|
float texture = (tmp.x + tmp.y + tmp.z) / 6.;
|
||||||
if (abs(vNormal.x) + abs(vNormal.y) + abs(vNormal.z) > 0.01) {
|
|
||||||
gl_FragColor = vec4((texture * diffuse * 0.8) + (texture * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
gl_FragColor = vec4((texture * diffuse * 0.8) + (texture * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
||||||
} else {
|
|
||||||
gl_FragColor = vec4((texture * vec3(1.)), 1.0);
|
|
||||||
}
|
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
const fsSource2 = `
|
const fsSource2 = `
|
||||||
|
@ -116,19 +112,50 @@ async function main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec3 n = normalize(vec3(-500., 1000., 500.) - vPosition);
|
vec3 n = normalize(vec3(-50000., 100000., 50000.) - vPosition);
|
||||||
float diffuse = max(dot(vNormal.xyz, n), 0.);
|
float diffuse = max(dot(normalize(vNormal.xyz), n), 0.);
|
||||||
float specular = pow(
|
float specular = pow(
|
||||||
max(dot(
|
max(dot(
|
||||||
reflect(n, vNormal.xyz),
|
reflect(n, normalize(vNormal.xyz)),
|
||||||
normalize(vec3(0., 0., -50.) - vPosition)),
|
normalize(vec3(0., 0., -50.) - vPosition)),
|
||||||
0.), 10.);
|
0.), 10.);
|
||||||
vec3 texture = extremize(mod(vPosition.xyz + vec3(1000.), vec3(2.)), 2.) / vec3(2);
|
vec3 texture = extremize(mod(vPosition.xyz + vec3(1000.), vec3(2.)), 2.) / vec3(2);
|
||||||
if (abs(vNormal.x) + abs(vNormal.y) + abs(vNormal.z) > 0.01) {
|
|
||||||
gl_FragColor = vec4((texture * diffuse * 0.8) + (texture * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
gl_FragColor = vec4((texture * diffuse * 0.8) + (texture * vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
||||||
} else {
|
}`;
|
||||||
gl_FragColor = vec4((texture * vec3(1.)), 1.0);
|
|
||||||
|
const fsSource3 = `
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
varying highp vec4 vColor;
|
||||||
|
varying highp vec4 vNormal;
|
||||||
|
varying highp vec3 vPosition;
|
||||||
|
|
||||||
|
vec3 extremize(vec3 v, float n) {
|
||||||
|
if (v.x > n / 2.)
|
||||||
|
v.x = n;
|
||||||
|
else
|
||||||
|
v.x = 0.;
|
||||||
|
if (v.y > n / 2.)
|
||||||
|
v.y = n;
|
||||||
|
else
|
||||||
|
v.y = 0.;
|
||||||
|
if (v.z > n / 2.)
|
||||||
|
v.z = n;
|
||||||
|
else
|
||||||
|
v.z = 0.;
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec3 n = normalize(vec3(-50000., 100000., 50000.) - vPosition);
|
||||||
|
float diffuse = max(dot(normalize(vNormal.xyz), n), 0.);
|
||||||
|
float specular = pow(
|
||||||
|
max(dot(
|
||||||
|
reflect(n, normalize(vNormal.xyz)),
|
||||||
|
normalize(vec3(0., 0., -50.) - vPosition)),
|
||||||
|
0.), 10.);
|
||||||
|
vec3 texture = extremize(mod(vPosition.xyz + vec3(1000.), vec3(2.)), 2.) / vec3(2);
|
||||||
|
gl_FragColor = vec4((diffuse * 0.8) + (vec3(0.2)) + (specular * vec3(1.)), 1.0);
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
|
@ -146,7 +173,9 @@ async function main() {
|
||||||
|
|
||||||
const data = await getObj('/static/objs/teapot.obj');
|
const data = await getObj('/static/objs/teapot.obj');
|
||||||
let distance: any = $('#input1').val();
|
let distance: any = $('#input1').val();
|
||||||
|
let circleSize: any = $('#input2').val();
|
||||||
distance = parseFloat(distance);
|
distance = parseFloat(distance);
|
||||||
|
circleSize = parseFloat(circleSize);
|
||||||
const [
|
const [
|
||||||
positions,
|
positions,
|
||||||
normals,
|
normals,
|
||||||
|
@ -157,7 +186,7 @@ async function main() {
|
||||||
console.log(uvs);
|
console.log(uvs);
|
||||||
let [shaderProgram, fragmentShader]: any = initShaderProgram(gl,
|
let [shaderProgram, fragmentShader]: any = initShaderProgram(gl,
|
||||||
vsSource,
|
vsSource,
|
||||||
fsSource);
|
fsSource3);
|
||||||
|
|
||||||
let programInfo: any = {
|
let programInfo: any = {
|
||||||
program: shaderProgram,
|
program: shaderProgram,
|
||||||
|
@ -199,10 +228,28 @@ async function main() {
|
||||||
buffers,
|
buffers,
|
||||||
deltaTime,
|
deltaTime,
|
||||||
length,
|
length,
|
||||||
distance);
|
distance,
|
||||||
|
circleSize);
|
||||||
requestAnimationFrame(render);
|
requestAnimationFrame(render);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes a new obj file to the gl buffer
|
||||||
|
* @param {string} data the obj file to push
|
||||||
|
*/
|
||||||
|
function updateObj(data: string) {
|
||||||
|
const [
|
||||||
|
positions,
|
||||||
|
normals,
|
||||||
|
uvs,
|
||||||
|
indices,
|
||||||
|
] = convert(data);
|
||||||
|
console.log(uvs);
|
||||||
|
length = indices.length;
|
||||||
|
deleteBuffers(gl, buffers);
|
||||||
|
buffers = initBuffers(gl, positions, indices, normals);
|
||||||
|
}
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
$('#input1').on('keypress', function(event: any) {
|
$('#input1').on('keypress', function(event: any) {
|
||||||
if (event.which === 13) {
|
if (event.which === 13) {
|
||||||
|
@ -210,6 +257,12 @@ async function main() {
|
||||||
$('#button3').click();
|
$('#button3').click();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
$('#input2').on('keypress', function(event: any) {
|
||||||
|
if (event.which === 13) {
|
||||||
|
event.preventDefault();
|
||||||
|
$('#button4').click();
|
||||||
|
}
|
||||||
|
});
|
||||||
$('#button1').on('click', function() {
|
$('#button1').on('click', function() {
|
||||||
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
||||||
shaderProgram, fragmentShader, fsSource, vsSource);
|
shaderProgram, fragmentShader, fsSource, vsSource);
|
||||||
|
@ -218,41 +271,34 @@ async function main() {
|
||||||
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
||||||
shaderProgram, fragmentShader, fsSource2, vsSource);
|
shaderProgram, fragmentShader, fsSource2, vsSource);
|
||||||
});
|
});
|
||||||
|
$('#button3').on('click', function() {
|
||||||
|
[programInfo, fragmentShader] = changeFragmentShader(gl,
|
||||||
|
shaderProgram, fragmentShader, fsSource3, vsSource);
|
||||||
|
});
|
||||||
$('#button3').on('click', function() {
|
$('#button3').on('click', function() {
|
||||||
distance = $('#input1').val();
|
distance = $('#input1').val();
|
||||||
distance = parseFloat(distance);
|
distance = parseFloat(distance);
|
||||||
});
|
});
|
||||||
|
$('#button4').on('click', function() {
|
||||||
|
circleSize = $('#input2').val();
|
||||||
|
circleSize = parseFloat(circleSize);
|
||||||
|
});
|
||||||
$('#sphere').on('click', async function() {
|
$('#sphere').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/sphere.obj');
|
const data = await getObj('/static/objs/sphere.obj');
|
||||||
const [
|
updateObj(data);
|
||||||
positions,
|
|
||||||
normals,
|
|
||||||
uvs,
|
|
||||||
indices,
|
|
||||||
] = convert(data);
|
|
||||||
console.log(uvs);
|
|
||||||
length = indices.length;
|
|
||||||
deleteBuffers(gl, buffers);
|
|
||||||
buffers = initBuffers(gl, positions, indices, normals);
|
|
||||||
});
|
});
|
||||||
$('#teapot').on('click', async function() {
|
$('#teapot').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/teapot.obj');
|
const data = await getObj('/static/objs/teapot.obj');
|
||||||
const [
|
updateObj(data);
|
||||||
positions,
|
});
|
||||||
normals,
|
$('#fox').on('click', async function() {
|
||||||
uvs,
|
const data = await getObj('/static/objs/fox.obj');
|
||||||
indices,
|
updateObj(data);
|
||||||
] = convert(data);
|
|
||||||
console.log(uvs);
|
|
||||||
length = indices.length;
|
|
||||||
deleteBuffers(gl, buffers);
|
|
||||||
buffers = initBuffers(gl, positions, indices, normals);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
requestAnimationFrame(render);
|
requestAnimationFrame(render);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a webgl scene
|
* Draw a webgl scene
|
||||||
* @param {any} gl the WebGL context
|
* @param {any} gl the WebGL context
|
||||||
|
@ -261,13 +307,15 @@ async function main() {
|
||||||
* @param {number} deltaTime the difference in time since last call
|
* @param {number} deltaTime the difference in time since last call
|
||||||
* @param {number} length the index buffer length
|
* @param {number} length the index buffer length
|
||||||
* @param {number} distance distance of camera
|
* @param {number} distance distance of camera
|
||||||
|
* @param {number} circleSize size of circle the object is rotating around
|
||||||
*/
|
*/
|
||||||
function drawScene(gl: any,
|
function drawScene(gl: any,
|
||||||
programInfo: any,
|
programInfo: any,
|
||||||
buffers: any,
|
buffers: any,
|
||||||
deltaTime: number,
|
deltaTime: number,
|
||||||
length: number,
|
length: number,
|
||||||
distance: number) {
|
distance: number,
|
||||||
|
circleSize: number) {
|
||||||
gl.clearColor(0.0, 0.0, 0.0, 1.0);
|
gl.clearColor(0.0, 0.0, 0.0, 1.0);
|
||||||
gl.clearDepth(1.0);
|
gl.clearDepth(1.0);
|
||||||
gl.enable(gl.DEPTH_TEST);
|
gl.enable(gl.DEPTH_TEST);
|
||||||
|
@ -284,7 +332,7 @@ function drawScene(gl: any,
|
||||||
const fieldOfView = 45 * Math.PI / 180;
|
const fieldOfView = 45 * Math.PI / 180;
|
||||||
const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight;
|
const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight;
|
||||||
const zNear = 0.1;
|
const zNear = 0.1;
|
||||||
const zFar = 150.0;
|
const zFar = 1000.0;
|
||||||
const projectionMatrix = mat4.create();
|
const projectionMatrix = mat4.create();
|
||||||
|
|
||||||
// note: glmatrix.js always has the first argument
|
// note: glmatrix.js always has the first argument
|
||||||
|
@ -315,8 +363,11 @@ function drawScene(gl: any,
|
||||||
|
|
||||||
mat4.translate(
|
mat4.translate(
|
||||||
viewMatrix,
|
viewMatrix,
|
||||||
viewMatrix,
|
viewMatrix, [
|
||||||
[Math.cos(squareRotation) * 5, Math.sin(squareRotation) * 5, 0]);
|
Math.cos(squareRotation) * circleSize,
|
||||||
|
Math.sin(squareRotation) * circleSize,
|
||||||
|
0,
|
||||||
|
]);
|
||||||
|
|
||||||
mat4.translate(
|
mat4.translate(
|
||||||
viewMatrix,
|
viewMatrix,
|
||||||
|
|
|
@ -11,12 +11,10 @@ export default function convert (objText) {
|
||||||
const indices = [];
|
const indices = [];
|
||||||
|
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
const line = lines[i];
|
if (lines[i] != '')
|
||||||
if (line != '')
|
|
||||||
{
|
{
|
||||||
const rawchunks = line.split(" ").map(x => x.trim());
|
const rawchunks = lines[i].split(" ").map(x => x.trim());
|
||||||
const chunks = [];
|
const chunks = [];
|
||||||
|
|
||||||
for (let i = 0; i < rawchunks.length; i++) {
|
for (let i = 0; i < rawchunks.length; i++) {
|
||||||
if (rawchunks[i] != '') {
|
if (rawchunks[i] != '') {
|
||||||
chunks.push(rawchunks[i]);
|
chunks.push(rawchunks[i]);
|
||||||
|
@ -51,7 +49,6 @@ export default function convert (objText) {
|
||||||
const c2 = (smoothing ? "s" : "") + chunks[2];
|
const c2 = (smoothing ? "s" : "") + chunks[2];
|
||||||
const c3 = (smoothing ? "s" : "") + chunks[3];
|
const c3 = (smoothing ? "s" : "") + chunks[3];
|
||||||
|
|
||||||
|
|
||||||
let index1 = vertices.indexOf(c1);
|
let index1 = vertices.indexOf(c1);
|
||||||
if (index1 === -1) {
|
if (index1 === -1) {
|
||||||
index1 = vertices.length;
|
index1 = vertices.length;
|
||||||
|
@ -74,32 +71,9 @@ export default function convert (objText) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const avgNormals = [];
|
|
||||||
for (let i = 0; i < vertices.length; i++) {
|
|
||||||
if (vertices[i].startsWith("s")) {
|
|
||||||
const d = vertices[i].substr(1).split("/");
|
|
||||||
const normal = normals[d[2] - 1];
|
|
||||||
const index = d[0] - 1;
|
|
||||||
|
|
||||||
if (avgNormals[index]) {
|
|
||||||
avgNormals[index][0] += normal[0];
|
|
||||||
avgNormals[index][1] += normal[1];
|
|
||||||
avgNormals[index][2] += normal[2];
|
|
||||||
} else {
|
|
||||||
avgNormals[index] = normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let n of avgNormals) {
|
|
||||||
const len = Math.hypot(...n);
|
|
||||||
avgNormals[avgNormals.indexOf(n)] = n.map(x => x / len);
|
|
||||||
}
|
|
||||||
|
|
||||||
const outPositions = [];
|
const outPositions = [];
|
||||||
const outNormals = [];
|
const outNormals = [];
|
||||||
const outUVs = [];
|
const outUVs = [];
|
||||||
|
|
|
@ -17,15 +17,21 @@
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<button id='button1'>Change Shader to black and white</button>
|
<button id='button1'>Change Shader to black and white</button>
|
||||||
<button id='button2'>Change Shader to colored</button>
|
<button id='button2'>Change Shader to colored</button>
|
||||||
|
<button id='button3'>Change Shader to flat</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<input id='input1' value='50'></input>
|
<input id='input1' value='50'></input>
|
||||||
<button id='button3'>Change camera distance</button>
|
<button id='button3'>Change camera distance</button>
|
||||||
<div style='display: inline'>Max distance is 150</div>
|
<div style='display: inline'>Max distance is 1000</div>
|
||||||
|
</div>
|
||||||
|
<div class='ui-block'>
|
||||||
|
<input id='input2' value='5'></input>
|
||||||
|
<button id='button4'>Change circle size</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<button id='sphere'>Set obj to sphere</button>
|
<button id='sphere'>Set obj to sphere</button>
|
||||||
<button id='teapot'>Set obj to teapot</button>
|
<button id='teapot'>Set obj to teapot</button>
|
||||||
|
<button id='fox'>Set obj to fox</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue