Fix : prevent render retrigger when color changes

This commit is contained in:
2024-05-22 12:45:34 +02:00
parent 310b3e7b17
commit bd6978d392
3 changed files with 34 additions and 13 deletions
+19 -10
View File
@@ -11,11 +11,14 @@ const shaderOptions = { quality: 6, framerate: 1000 / 60 }
const bounds = { left: 0, bottom: 0 } const bounds = { left: 0, bottom: 0 }
const screen = { width: 0, height: 0, devicePixelRatio: 0 } const screen = { width: 0, height: 0, devicePixelRatio: 0 }
const _colorStart = [0, 0, 0]
const _colorEnd = [0, 0, 0]
let fragmentShader = resolveLygia(noise); let fragmentShader = resolveLygia(noise);
let canvas: OffscreenCanvas let canvas: OffscreenCanvas
async function main(canvas: OffscreenCanvas, fragmentShader2: string, _colorStart: [number, number, number], _colorEnd: [number, number, number]) { async function main(canvas: OffscreenCanvas, fragmentShader2: string) {
const gl = canvas.getContext("webgl"); const gl = canvas.getContext("webgl");
if (!gl) { if (!gl) {
return; return;
@@ -109,9 +112,7 @@ async function main(canvas: OffscreenCanvas, fragmentShader2: string, _colorStar
const aspectRatio = Math.max(screen.width, screen.height) * screen.devicePixelRatio const aspectRatio = Math.max(screen.width, screen.height) * screen.devicePixelRatio
gl2.uniform2f(offset, bounds.left, -bounds.bottom); gl2.uniform2f(offset, bounds.left, -bounds.bottom);
// console.log(canvas.getBoundingClientRect().left * window.devicePixelRatio)
gl2.uniform1i(quality, shaderOptions.quality) gl2.uniform1i(quality, shaderOptions.quality)
gl2.uniform2f(resolutionLocation, aspectRatio, aspectRatio); gl2.uniform2f(resolutionLocation, aspectRatio, aspectRatio);
gl2.uniform3f(colorStart, _colorStart[0], _colorStart[1], _colorStart[2]); gl2.uniform3f(colorStart, _colorStart[0], _colorStart[1], _colorStart[2]);
@@ -122,9 +123,11 @@ async function main(canvas: OffscreenCanvas, fragmentShader2: string, _colorStar
0, // offset 0, // offset
6, // num vertices to process 6, // num vertices to process
); );
requestAnimationFrame(render)
} }
self.clearInterval(interval) // self.clearInterval(interval)
interval = self.setInterval(() => requestAnimationFrame(render), shaderOptions.framerate) // interval = self.setInterval(() => requestAnimationFrame(render), shaderOptions.framerate)
requestAnimationFrame(render)
} }
self.addEventListener("message", (e) => { self.addEventListener("message", (e) => {
@@ -132,25 +135,31 @@ self.addEventListener("message", (e) => {
if (data.command == "initShader") { if (data.command == "initShader") {
canvas = data.canvas canvas = data.canvas
} else if (data.command == "killShader") { } else if (data.command == "killShader") {
console.log("killShader")
self.clearInterval(interval) self.clearInterval(interval)
} else { } else {
console.log(screen.devicePixelRatio)
bounds.bottom = data.bounds.bottom bounds.bottom = data.bounds.bottom
bounds.left = data.bounds.left bounds.left = data.bounds.left
screen.devicePixelRatio = data.screen.devicePixelRatio screen.devicePixelRatio = data.screen.devicePixelRatio
screen.width = data.screen.width screen.width = data.screen.width
screen.height = data.screen.height screen.height = data.screen.height
_colorStart[0] = data.colorStart[0]
_colorStart[1] = data.colorStart[1]
_colorStart[2] = data.colorStart[2]
_colorEnd[0] = data.colorEnd[0]
_colorEnd[1] = data.colorEnd[1]
_colorEnd[2] = data.colorEnd[2]
if (data.command == "reloadShader") { if (data.command == "reloadShader") {
shaderOptions.quality = data.shaderOptions.quality shaderOptions.quality = data.shaderOptions.quality
shaderOptions.framerate = data.shaderOptions.framerate shaderOptions.framerate = data.shaderOptions.framerate
reloadShader()
reloadShader(data.canvas, data.colorStart, data.colorEnd)
} }
} }
}) })
async function reloadShader(canvas: OffscreenCanvas, _colorStart: [number, number, number], _colorEnd: [number, number, number]) { async function reloadShader() {
if (!canvas) { return } if (!canvas) { return }
let fragmentShader2 = fragmentShader.replace("#define FBM_OCTAVES 6", "#define FBM_OCTAVES " + shaderOptions.quality); let fragmentShader2 = fragmentShader.replace("#define FBM_OCTAVES 6", "#define FBM_OCTAVES " + shaderOptions.quality);
self.clearInterval(interval) main(canvas, fragmentShader2);
main(canvas, fragmentShader2, _colorStart, _colorEnd);
} }
+15 -2
View File
@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
const settingsStore = useSettingsStore() const settingsStore = useSettingsStore()
import { off } from 'process';
import ShaderWorker from '~/assets/workers/ShaderWorker?worker' import ShaderWorker from '~/assets/workers/ShaderWorker?worker'
const worker = new ShaderWorker() const worker = new ShaderWorker()
@@ -49,6 +49,8 @@ function resizeShader() {
command: 'changeBounds', command: 'changeBounds',
bounds: { left: bounds.left, bottom: bounds.bottom }, bounds: { left: bounds.left, bottom: bounds.bottom },
screen: { height: window.screen.height, width: window.screen.width, devicePixelRatio }, screen: { height: window.screen.height, width: window.screen.width, devicePixelRatio },
colorStart: props.colorStart,
colorEnd: props.colorEnd
}) })
} }
@@ -58,11 +60,22 @@ function endShader() {
}) })
} }
watch(() => [settingsStore.shaderQuality, settingsStore.shaderFramerate, props.colorEnd, props.colorStart], () => { watch(() => [settingsStore.shaderQuality, settingsStore.shaderFramerate], () => {
safeReloadShader() safeReloadShader()
}) })
let has_resized = false
watch(() => [props.colorEnd, props.colorStart], () => {
if (!has_resized) {
has_resized = true
nextTick(() => {
resizeShader()
has_resized = false
})
}
})
onMounted(async () => { onMounted(async () => {
nextTick(() => { nextTick(() => {
initShader() initShader()
-1
View File
@@ -60,7 +60,6 @@ function can_buy_fire_gem(): boolean {
function checkEndTurn() { function checkEndTurn() {
// TODO: Add a confirmation dialog if resources are left // TODO: Add a confirmation dialog if resources are left
console.log("Checking end turn")
if ( if (
(!warning.value) (!warning.value)
&& has_actions_remaining()) { && has_actions_remaining()) {