Merge pull request #1027 from redbirdly/patch-6

Improve lightmap.js and fix bug caused by 1.11 update
This commit is contained in:
slweeb 2025-02-23 10:30:22 -05:00 committed by GitHub
commit 020b918065
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 136 additions and 100 deletions

View File

@ -1,5 +1,4 @@
// Redbirdly's Mod that adds a better light system if (!enabledMods.includes("mods/betterSettings.js")) { enabledMods.unshift("mods/betterSettings.js"); localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); window.location.reload() };
// if the mod is too laggy, use fast_lightmap.js
var lightmap = []; var lightmap = [];
var nextLightmap = []; var nextLightmap = [];
@ -9,12 +8,15 @@ var lightSourceBoost = 2;
var pixelSizeQuarter = pixelSizeHalf / 2; var pixelSizeQuarter = pixelSizeHalf / 2;
var falloff = 0.8; var falloff = 0.8;
// Define RGB colors // BetterSettings.js integration
var coldFireColor = [0, 191, 255]; var lightmap_settingsTab = new SettingsTab("Lightmap");
var fireflyColor = [240, 255, 70];
var radColor = [75, 100, 30]; var resolution_setting = new Setting("Resolution (higher number = lower quality)", "resolution", settingType.NUMBER, false, defaultValue=2);
var strangeMatterColor = [220 * 0.3, 255 * 0.3, 210 * 0.3];
var sparkColors = [[255, 210, 120], [255, 140, 10]]; lightmap_settingsTab.registerSettings("Resolution", resolution_setting);
settingsManager.registerTab(lightmap_settingsTab);
function getRandomElement(arr) { function getRandomElement(arr) {
return arr[Math.floor(Math.random() * arr.length)]; return arr[Math.floor(Math.random() * arr.length)];
@ -22,35 +24,34 @@ function getRandomElement(arr) {
if (!rgbToArray) { if (!rgbToArray) {
function rgbToArray(colorString) { function rgbToArray(colorString) {
if (typeof colorString !== 'string') { if (typeof colorString !== "string") {
console.error('Invalid colorString:', colorString); console.error("Invalid colorString:", colorString);
return null; return null;
} }
if (colorString.startsWith("rgb")) {
if (colorString.startsWith('rgb')) { return colorString
return colorString.slice(4, -1).split(',').map(val => parseInt(val.trim())); .slice(4, -1)
} else if (colorString.startsWith('#')) { .split(",")
.map(val => parseInt(val.trim()));
} else if (colorString.startsWith("#")) {
let hex = colorString.slice(1); let hex = colorString.slice(1);
// Handle shorthand hex (e.g., #03F)
if (hex.length === 3) { if (hex.length === 3) {
hex = hex.split('').map(char => char + char).join(''); hex = hex
.split("")
.map(char => char + char)
.join("");
} }
if (hex.length !== 6) { if (hex.length !== 6) {
console.error('Invalid hex color:', colorString); console.error("Invalid hex color:", colorString);
return null; return null;
} }
var r = parseInt(hex.slice(0, 2), 16);
const r = parseInt(hex.slice(0, 2), 16); var g = parseInt(hex.slice(2, 4), 16);
const g = parseInt(hex.slice(2, 4), 16); var b = parseInt(hex.slice(4, 6), 16);
const b = parseInt(hex.slice(4, 6), 16);
return [r, g, b]; return [r, g, b];
} else {
console.error('Invalid color format:', colorString);
return null;
} }
console.error("Invalid color format:", colorString);
return null;
} }
} }
@ -59,19 +60,20 @@ function scaleList(numbers, scale) {
} }
function initializeLightmap(_width, _height) { function initializeLightmap(_width, _height) {
const lightmapWidth = Math.ceil(_width / lightmapScale); lightmapWidth = Math.ceil(_width / lightmapScale) + 1;
const lightmapHeight = Math.ceil(_height / lightmapScale); lightmapHeight = Math.ceil(_height / lightmapScale) + 1;
const createLightmapArray = (width, height) => function createLightmapArray(width_, height_) {
Array.from({ length: height }, () => return Array.from({ length: height_ }, () =>
Array.from({ length: width }, () => ({ color: [0, 0, 0] })) Array.from({ length: width_ }, () => ({ color: [0, 0, 0] }))
); );
}
const newLightmap = createLightmapArray(lightmapWidth, lightmapHeight); var newLightmap = createLightmapArray(lightmapWidth, lightmapHeight);
const newNextLightmap = createLightmapArray(lightmapWidth, lightmapHeight); var newNextLightmap = createLightmapArray(lightmapWidth, lightmapHeight);
lightmap = newLightmap; lightmap = newLightmap;
nextLightmap = newNextLightmap; nextLightmap = newNextLightmap;
} }
function deepCopy(source, target) { function deepCopy(source, target) {
@ -88,12 +90,11 @@ function propagateLightmap() {
var width = lightmap[0].length; var width = lightmap[0].length;
var height = lightmap.length; var height = lightmap.length;
var neighbors = [ var neighbors = [
{ dx: 1, dy: 0 }, { dx: 1, dy: 0 },
{ dx: -1, dy: 0 }, { dx: -1, dy: 0 },
{ dx: 0, dy: 1 }, { dx: 0, dy: 1 },
{ dx: 0, dy: -1 }, { dx: 0, dy: -1 }
]; ];
for (var y = 0; y < height; y++) { for (var y = 0; y < height; y++) {
@ -114,9 +115,9 @@ function propagateLightmap() {
nextLightmap[y][x] = { nextLightmap[y][x] = {
color: [ color: [
Math.min(Math.max(0, totalColor[0] / neighborCount * falloff), 255 * 8), Math.min(Math.max(0, (totalColor[0] / neighborCount) * falloff), 255 * 8),
Math.min(Math.max(0, totalColor[1] / neighborCount * falloff), 255 * 8), Math.min(Math.max(0, (totalColor[1] / neighborCount) * falloff), 255 * 8),
Math.min(Math.max(0, totalColor[2] / neighborCount * falloff), 255 * 8) Math.min(Math.max(0, (totalColor[2] / neighborCount) * falloff), 255 * 8)
] ]
}; };
} }
@ -126,67 +127,96 @@ function propagateLightmap() {
} }
function rgbToHsv(r, g, b) { function rgbToHsv(r, g, b) {
r /= 255; g /= 255; b /= 255; r /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b); g /= 255;
var h, s, v = max; b /= 255;
var max = Math.max(r, g, b);
var min = Math.min(r, g, b);
var h, s;
var v = max;
var d = max - min; var d = max - min;
s = max === 0 ? 0 : d / max; s = max === 0 ? 0 : d / max;
if (max === min) { if (max === min) {
h = 0; h = 0;
} else { } else {
switch (max) { switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break; case r:
case g: h = (b - r) / d + 2; break; h = (g - b) / d + (g < b ? 6 : 0);
case b: h = (r - g) / d + 4; break; break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
} }
h /= 6; h /= 6;
} }
return [h, s, v]; return [h, s, v];
} }
function hsvToRgb(h, s, v) { function hsvToRgb(h, s, v) {
var r, g, b;
var i = Math.floor(h * 6); var i = Math.floor(h * 6);
var f = h * 6 - i; var f = h * 6 - i;
var p = v * (1 - s); var p = v * (1 - s);
var q = v * (1 - f * s); var q = v * (1 - f * s);
var t = v * (1 - (1 - f) * s); var t = v * (1 - (1 - f) * s);
var r, g, b;
switch (i % 6) { switch (i % 6) {
case 0: r = v; g = t; b = p; break; case 0:
case 1: r = q; g = v; b = p; break; r = v;
case 2: r = p; g = v; b = t; break; g = t;
case 3: r = p; g = q; b = v; break; b = p;
case 4: r = t; g = p; b = v; break; break;
case 5: r = v; g = p; b = q; break; case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
case 5:
r = v;
g = p;
b = q;
break;
} }
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
} }
function renderLightmapPrePixel(ctx) { function renderLightmapPrePixel(ctx) {
if (!lightmap || !lightmap[0]) return; if (!lightmap || !lightmap[0]) return;
var _width = lightmap[0].length;
var _height = lightmap.length;
var _width = lightmap[0].length; for (var y = 0; y < _height; y++) {
var _height = lightmap.length; for (var x = 0; x < _width; x++) {
var color = lightmap[y][x].color;
var r = color[0];
var g = color[1];
var b = color[2];
for (var y = 0; y < _height; y++) { if (r > 16 || g > 16 || b > 16) {
for (var x = 0; x < _width; x++) { var hsv = rgbToHsv(r, g, b);
var { color } = lightmap[y][x]; var newColor = hsvToRgb(hsv[0], hsv[1], 1);
var [r, g, b] = color; var alpha = hsv[2];
if (r > 16 || g > 16 || b > 16) { ctx.globalAlpha = 1.0;
var [h, s, v] = rgbToHsv(r, g, b); ctx.fillStyle = `rgba(${newColor[0]}, ${newColor[1]}, ${newColor[2]}, ${alpha * 0.4})`;
var newColor = hsvToRgb(h, s, 1);
var alpha = v;
ctx.globalAlpha = 1.0;
ctx.fillStyle = `rgba(${newColor[0]}, ${newColor[1]}, ${newColor[2]}, ${alpha * 0.4})`;
ctx.fillRect( ctx.fillRect(
x * pixelSize * lightmapScale, x * pixelSize * lightmapScale,
y * pixelSize * lightmapScale, y * pixelSize * lightmapScale,
@ -201,27 +231,39 @@ function renderLightmapPrePixel(ctx) {
pixelSize * lightmapScale * 2, pixelSize * lightmapScale * 2,
pixelSize * lightmapScale * 2 pixelSize * lightmapScale * 2
); );
} }
} }
} }
} }
// Register the function to run before each pixel is rendered // Main loop
renderPrePixel(function(ctx) { renderPrePixel(function(ctx) {
if (!paused) {propagateLightmap();} // Reset lightmap if resolution changed
renderLightmapPrePixel(ctx); if (resolution_setting.value != lightmapScale) {
lightmapScale = resolution_setting.value;
initializeLightmap(width, height);
return;
}
if (!paused) {
propagateLightmap();
}
renderLightmapPrePixel(ctx);
}); });
function glowItsOwnColor(pixel) { function glowItsOwnColor(pixel) {
if (!pixel.color) {return;} if (!pixel.color) return;
var x = Math.floor(pixel.x / lightmapScale); var x = Math.floor(pixel.x / lightmapScale);
var y = Math.floor(pixel.y / lightmapScale); var y = Math.floor(pixel.y / lightmapScale);
lightmap[y][x] = { color: scaleList(rgbToArray(pixel.color), lightSourceBoost) }; try {
lightmap[y][x] = { color: scaleList(rgbToArray(pixel.color), lightSourceBoost) };
} catch (e) {
console.log(e, pixel, pixel.color, rgbToArray(pixel.color), x, y)
}
} }
function glowItsOwnColorIfPowered(pixel) { function glowItsOwnColorIfPowered(pixel) {
if (!pixel.charge || pixel.charge <= 0) {return;} if (!pixel.charge || pixel.charge <= 0) return;
if (!pixel.color) return; if (!pixel.color) return;
var x = Math.floor(pixel.x / lightmapScale); var x = Math.floor(pixel.x / lightmapScale);
var y = Math.floor(pixel.y / lightmapScale); var y = Math.floor(pixel.y / lightmapScale);
@ -229,7 +271,7 @@ function glowItsOwnColorIfPowered(pixel) {
} }
function glowColor(pixel, color) { function glowColor(pixel, color) {
if (!color) {return;} if (!color) return;
var x = Math.floor(pixel.x / lightmapScale); var x = Math.floor(pixel.x / lightmapScale);
var y = Math.floor(pixel.y / lightmapScale); var y = Math.floor(pixel.y / lightmapScale);
lightmap[y][x] = { color: scaleList(color, lightSourceBoost) }; lightmap[y][x] = { color: scaleList(color, lightSourceBoost) };
@ -241,7 +283,6 @@ function glowRadiationColor(pixel) {
lightmap[y][x] = { color: scaleList(radColor, lightSourceBoost) }; lightmap[y][x] = { color: scaleList(radColor, lightSourceBoost) };
} }
// Define element tick functions
var originalStrangeMatterTick = elements.strange_matter.tick; var originalStrangeMatterTick = elements.strange_matter.tick;
elements.strange_matter.tick = function(pixel) { elements.strange_matter.tick = function(pixel) {
originalStrangeMatterTick(pixel); originalStrangeMatterTick(pixel);
@ -266,9 +307,9 @@ elements.laser.tick = function(pixel) {
glowColor(pixel, scaleList(rgbToArray(pixel.color), 0.5)); glowColor(pixel, scaleList(rgbToArray(pixel.color), 0.5));
}; };
var originalFireTick2 = elements.fire.tick; var originalFireTick3 = elements.fire.tick;
elements.fire.tick = function(pixel) { elements.fire.tick = function(pixel) {
originalFireTick2(pixel); originalFireTick3(pixel);
glowItsOwnColor(pixel); glowItsOwnColor(pixel);
}; };
@ -287,10 +328,8 @@ elements.rainbow.tick = function(pixel) {
var originalFireflyTick = elements.firefly.tick; var originalFireflyTick = elements.firefly.tick;
elements.firefly.tick = function(pixel) { elements.firefly.tick = function(pixel) {
originalFireflyTick(pixel); originalFireflyTick(pixel);
var x = Math.floor(pixel.x / lightmapScale); var x = Math.floor(pixel.x / lightmapScale);
var y = Math.floor(pixel.y / lightmapScale); var y = Math.floor(pixel.y / lightmapScale);
var tickMod = pixelTicks % pixel.fff; var tickMod = pixelTicks % pixel.fff;
var num; var num;
@ -315,10 +354,8 @@ elements.sun.tick = glowItsOwnColor;
elements.magma.tick = glowItsOwnColor; elements.magma.tick = glowItsOwnColor;
elements.plasma.tick = glowItsOwnColor; elements.plasma.tick = glowItsOwnColor;
elements.fw_ember.tick = glowItsOwnColor; elements.fw_ember.tick = glowItsOwnColor;
elements.cold_fire.tick = glowItsOwnColor; elements.cold_fire.tick = glowItsOwnColor;
// Radioactive elements
var radioactiveElements = [ var radioactiveElements = [
"uranium", "radiation", "rad_glass", "fallout", "uranium", "radiation", "rad_glass", "fallout",
"molten_uranium", "rad_shard", "rad_cloud", "rad_steam" "molten_uranium", "rad_shard", "rad_cloud", "rad_steam"
@ -327,12 +364,11 @@ radioactiveElements.forEach(element => {
elements[element].tick = glowRadiationColor; elements[element].tick = glowRadiationColor;
}); });
window.addEventListener('load', () => { var fireflyColor = [240, 255, 70];
initializeLightmap(width, height); var radColor = [75, 100, 30];
var strangeMatterColor = [220 * 0.3, 255 * 0.3, 210 * 0.3];
var sparkColors = [[255, 210, 120], [255, 140, 10]];
var originalResizeCanvas = resizeCanvas; runAfterReset(() => {
resizeCanvas = function(newHeight, newWidth, newPixelSize, clear) { initializeLightmap(width, height);
originalResizeCanvas(newHeight, newWidth, newPixelSize, clear);
initializeLightmap(width, height);
};
}); });