Published
Edited
Dec 3, 2021
2 forks
Importers
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
{
gl.viewport(0, 0, canvasWidth, canvasHeight);

gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
renderLight();
renderScene(false);
if (receiver.shadowed) renderShadow();
if (misc.showReceiver) {
renderReceiver(1);
}
if (misc.skyboxFlag) renderSkybox();
return gl.canvas;
}
Insert cell
renderShadow = () => {
if (misc.stencilFlag) {
gl.clearStencil(0);
gl.clear(gl.STENCIL_BUFFER_BIT);
setMaskingParameters(1);
renderReceiver(1);
setStencilingParameters(1);
//Render with stencil testing
}
renderScene(true);

if (misc.stencilFlag) setDefaultParameters(); // Undo all that was done to do stenciling.
}
Insert cell
md`### Variables and Functions`
Insert cell
Insert cell
setStencilingParameters = (ref) => {
// drawMask function from https://observablehq.com/@esperanc/stencil-buffer
gl.enable(gl.STENCIL_TEST);
gl.stencilFunc(
gl.EQUAL, // the test
ref, // reference value
0xff // mask
);
gl.stencilOp(
gl.KEEP, // what to do if the stencil test fails
gl.KEEP, // what to do if the depth test fails
gl.KEEP // what to do if both tests pass
);
gl.colorMask(true, true, true, true);
gl.depthMask(true);
}
Insert cell
setDefaultParameters = () => {
gl.disable(gl.STENCIL_TEST);
gl.enable(gl.DEPTH_TEST);
gl.colorMask(true, true, true, true);
gl.depthMask(true);
}
Insert cell
modelObj = raymanObj //houseObj //boyObj //
Insert cell
Insert cell
projectionMatrix = getProjectionMatrix(fov_Y, near, far)
Insert cell
fov_Y = 45
Insert cell
near = 0.1
Insert cell
far = 5
Insert cell
aspect = canvasWidth/canvasHeight
Insert cell
Insert cell
Insert cell
Insert cell
deg2rad = (deg) => (Math.PI * deg) / 180
Insert cell
modelDim = computeModelExtent(modelObj)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
mutable debug = 0
Insert cell
textureURL = FileAttachment("Rayman.png").url()
Insert cell
textureImg = FileAttachment("Rayman.png").image()
Insert cell
Insert cell
Insert cell
renderScene = (shadowFlag) => {
const eyePosition = m4.inverse(viewMatrix).slice(12, 15);

const uniforms = {
modelMatrix: m4.identity(),
eyePosition,
lightPosition,
tex,
viewMatrix: viewMatrix,
projectionMatrix: projectionMatrix,
shadowFlag: shadowFlag,
planeNormal: receiverNormal,
Q: receiverCenter
};
mutable debug = uniforms;
gl.useProgram(sceneProgramInfo.program);
twgl.setUniforms(sceneProgramInfo, uniforms);
sceneBufferInfoArray.forEach((bufferInfo) => {
twgl.setBuffersAndAttributes(gl, sceneProgramInfo, bufferInfo);
twgl.drawBufferInfo(gl, bufferInfo);
});
}
Insert cell
renderReceiver = (alpha) => {
const eyePosition = m4.inverse(viewMatrix).slice(12, 15);

const uniforms = {
modelMatrix: receiverRotationMatrix, //m4.identity(),
eyePosition,
viewMatrix: viewMatrix,
projectionMatrix: projectionMatrix,
lightPosition,
planeNormal: receiverNormal,
alpha
};

gl.useProgram(receiverProgramInfo.program);
twgl.setUniforms(receiverProgramInfo, uniforms);

twgl.setBuffersAndAttributes(gl, receiverProgramInfo, receiverBufferInfo);
twgl.drawBufferInfo(gl, receiverBufferInfo);
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
cubemapImages = cubeimagesCroppedFromHCrossShape(cubemapurl, 512)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
receiverSize = modelDim.dia
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
md`### Shaders and ProgramInfo`
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
import { image_from_URL } from "@spattana/webgl-texturing-using-twgl"
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
import { hex2rgb } from "@spattana/cap-4720-introduction-to-observable"
Insert cell
v3 = twgl.v3
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more