Skip to content

Commit c7da598

Browse files
committed
cache background
1 parent fb7c878 commit c7da598

File tree

3 files changed

+84
-24
lines changed

3 files changed

+84
-24
lines changed

Diff for: src/em/index.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export function createEM(canvas: HTMLCanvasElement, gridSize: [number, number],
3131
cellSize: number, reflectiveBoundary: boolean, dt: number): EMState {
3232
const regl = createReglFromCanvas(canvas)
3333

34-
const { render, adjustSize } = makeRenderSimulatorCanvas(regl, gridSize)
34+
const { render, adjustCanvasSize, adjustGridSize } = makeRenderSimulatorCanvas(regl, [canvas.width, canvas.height], gridSize)
3535
const sim: Simulator = new FDTDSimulator(regl, gridSize, cellSize, reflectiveBoundary, dt)
3636

3737
const renderToCanvas = (showElectric: boolean, showMagnetic: boolean) => {
@@ -53,15 +53,20 @@ export function createEM(canvas: HTMLCanvasElement, gridSize: [number, number],
5353
sim.stepElectric(dt)
5454
}
5555

56+
const setGridSize = (newGridSize: [number, number]) => {
57+
sim.setGridSize(newGridSize)
58+
adjustGridSize(newGridSize)
59+
}
60+
5661
return {
5762
renderToCanvas: renderToCanvas,
58-
adjustCanvasSize: adjustSize,
63+
adjustCanvasSize: adjustCanvasSize,
5964
stepSim: stepSim,
6065
injectSignal: sim.injectSignal,
6166
getSources: () => sources,
6267
setSources: (newSources: SignalSource[]) => sources = newSources,
63-
setGridSize: (newGridSize: [number, number]) => sim.setGridSize(newGridSize),
64-
setCellSize: (newCellSize: number) => sim.setCellSize(newCellSize),
68+
setGridSize: setGridSize,
69+
setCellSize: sim.setCellSize,
6570
getTime: () => sim.getData().time,
6671
setReflectiveBoundary: sim.setReflectiveBoundary,
6772
loadMaterialFromComponents: sim.loadMaterialFromComponents,

Diff for: src/em/kernels/rendering.ts

+35-15
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,16 @@ export const blurDirectional = `
5757
}
5858
`
5959

60-
export const draw = `
60+
export const renderBackground = `
6161
precision highp float;
6262
63-
uniform sampler2D energyTexture;
64-
uniform sampler2D bloomTexture;
65-
uniform sampler2D materialTexture;
6663
uniform vec2 gridSize;
6764
6865
varying vec2 uv;
6966
7067
const float sqrtTwoPi = 2.50662827463;
7168
7269
void main() {
73-
vec2 energy = texture2D(energyTexture, uv).rg;
74-
vec2 bloom = texture2D(bloomTexture, uv).rg;
75-
vec3 material = texture2D(materialTexture, uv).rgb;
76-
77-
vec2 pValues = 2.0 / (1.0 + exp(-0.5 * (material.rg - 1.0))) - 1.0;
78-
float cValue = material.b / 10.0;
79-
8070
vec2 tileFactor = gridSize;
8171
8272
// Repeat -0.5..+0.5 sawtooth for as many cells as we have
@@ -94,11 +84,41 @@ export const draw = `
9484
float bgPermittivity = -smoothstep(0.0, 1.0, pCircleDists.x);
9585
float bgPermeability = -smoothstep(0.0, 1.0, pCircleDists.y);
9686
97-
bgPermittivity = pValues.x >= 0.1 ? 1.0 + bgPermittivity : bgPermittivity;
98-
bgPermeability = pValues.y >= 0.1 ? 1.0 + bgPermeability : bgPermeability;
87+
gl_FragColor = vec4(
88+
bgPermittivity,
89+
bgPermeability,
90+
dConductivity.x,
91+
dConductivity.y
92+
);
93+
}
94+
`
95+
96+
export const draw = `
97+
precision highp float;
98+
99+
uniform sampler2D energyTexture;
100+
uniform sampler2D bloomTexture;
101+
uniform sampler2D materialTexture;
102+
uniform sampler2D backgroundTexture;
103+
104+
varying vec2 uv;
105+
106+
const float sqrtTwoPi = 2.50662827463;
107+
108+
void main() {
109+
vec2 energy = texture2D(energyTexture, uv).rg;
110+
vec2 bloom = texture2D(bloomTexture, uv).rg;
111+
vec3 material = texture2D(materialTexture, uv).rgb;
112+
vec4 background = texture2D(backgroundTexture, uv);
113+
114+
vec2 pValues = 2.0 / (1.0 + exp(-0.5 * (material.rg - 1.0))) - 1.0;
115+
float cValue = material.b / 10.0;
116+
117+
float bgPermittivity = pValues.x >= 0.1 ? 1.0 + background.r : background.r;
118+
float bgPermeability = pValues.y >= 0.1 ? 1.0 + background.g : background.g;
99119
float backgroundConductivity = 0.5 * (cValue >= 0.0 ?
100-
cValue * smoothstep(0.0, 1.0, dConductivity.x) :
101-
-cValue * smoothstep(0.0, 1.0, dConductivity.y)
120+
cValue * smoothstep(0.0, 1.0, background.b) :
121+
-cValue * smoothstep(0.0, 1.0, background.a)
102122
);
103123
104124
gl_FragColor = vec4(

Diff for: src/em/rendering.ts

+40-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function createReglFromCanvas(canvas: HTMLCanvasElement) {
1717
})
1818
}
1919

20-
export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, number]) {
20+
export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, number], gridSize: [number, number]) {
2121
const filter = regl.hasExtension("OES_texture_half_float_linear") ? "linear" : "nearest"
2222

2323
const frameBuffers: Framebuffer2D[] = []
@@ -46,6 +46,32 @@ export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, numbe
4646

4747
const fbos = [makeFrameBuffer(), makeFrameBuffer()]
4848
const energyFbo = makeFrameBuffer()
49+
const backgroundFbo = makeFrameBuffer()
50+
51+
type RenderBackgroundUniforms = {
52+
gridSize: [number, number]
53+
}
54+
55+
const renderBackground = regl<RenderBackgroundUniforms, {}, RenderBackgroundUniforms>({
56+
frag: k.renderBackground,
57+
framebuffer: backgroundFbo,
58+
uniforms: {
59+
gridSize: (_, { gridSize }) => gridSize
60+
},
61+
62+
attributes: {
63+
position: [
64+
[1, -1],
65+
[1, 1],
66+
[-1, -1],
67+
[-1, 1]
68+
]
69+
},
70+
vert: k.vertDraw,
71+
count: 4,
72+
primitive: "triangle strip",
73+
depth: { enable: false }
74+
})
4975

5076
type RenderEnergyUniforms = {
5177
brightness: number
@@ -161,7 +187,7 @@ export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, numbe
161187
energyTexture: Framebuffer2D
162188
bloomTexture: Framebuffer2D
163189
materialTexture: Framebuffer2D
164-
gridSize: [number, number]
190+
backgroundTexture: Framebuffer2D
165191
}
166192

167193
const draw = regl<DrawUniforms, {}, DrawUniforms>({
@@ -170,7 +196,7 @@ export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, numbe
170196
energyTexture: (_, { energyTexture }) => energyTexture,
171197
bloomTexture: (_, { bloomTexture }) => bloomTexture,
172198
materialTexture: (_, { materialTexture }) => materialTexture,
173-
gridSize: (_, { gridSize }) => gridSize,
199+
backgroundTexture: (_, { backgroundTexture }) => backgroundTexture,
174200
},
175201

176202
attributes: {
@@ -215,15 +241,24 @@ export function makeRenderSimulatorCanvas(regl: Regl, canvasSize: [number, numbe
215241
energyTexture: energyFbo,
216242
bloomTexture: fbos[0],
217243
materialTexture: material,
218-
gridSize: gridSize
244+
backgroundTexture: backgroundFbo
219245
})
220246
}
221247

248+
renderBackground({
249+
gridSize: gridSize
250+
})
251+
222252
return {
223253
render: render,
224-
adjustSize: (size: [number, number]) => {
254+
adjustCanvasSize: (size: [number, number]) => {
225255
frameBuffers.forEach(fbo => fbo.resize(size[0], size[1]))
226256
regl.poll()
257+
},
258+
adjustGridSize: (gridSize: [number, number]) => {
259+
renderBackground({
260+
gridSize: gridSize
261+
})
227262
}
228263
}
229264
}

0 commit comments

Comments
 (0)