| @@ -4,8 +4,6 @@ import GlobalEvents from "/app/js/common/EventCaller.js"; | |||
| import Input from "/app/js/ui/Input.js"; | |||
| import NESPalette from "/app/js/models/NESPalette.js"; | |||
| //import NESTile from "/app/js/models/NESTile.js"; | |||
| //import NESBank from "/app/js/models/NESBank.js"; | |||
| import ISurface from "/app/js/ifaces/ISurface.js"; | |||
| const EL_CANVAS_ID = "painter"; | |||
| @@ -182,18 +180,28 @@ class CTRLPainter { | |||
| }).bind(this); | |||
| GlobalEvents.listen("set_app_palette", handle_setapppalette); | |||
| var handle_surface_data_changed = (function(){ | |||
| RenderD(); | |||
| }).bind(this); | |||
| var handle_change_surface = (function(surf){ | |||
| if (!(surf instanceof ISurface)){ | |||
| console.log("WARNING: Attempted to set painter to non-surface instance."); | |||
| return; | |||
| } | |||
| this.__surface = surf; | |||
| if (this.__palette === null && this.__surface.palette !== null){ | |||
| this.__palette = this.__surface.palette; | |||
| } else if (this.__palette !== null && this.__surface.palette !== this.__palette){ | |||
| this.__surface.palette = this.__palette; | |||
| if (surf !== this.__surface){ | |||
| if (this.__surface !== null){ | |||
| this.__surface.unlisten("data_changed", handle_surface_data_changed); | |||
| } | |||
| this.__surface = surf; | |||
| this.__surface.listen("data_changed", handle_surface_data_changed); | |||
| if (this.__palette === null && this.__surface.palette !== null){ | |||
| this.__palette = this.__surface.palette; | |||
| } else if (this.__palette !== null && this.__surface.palette !== this.__palette){ | |||
| this.__surface.palette = this.__palette; | |||
| } | |||
| this.center_surface(); | |||
| } | |||
| this.center_surface(); | |||
| RenderD(); | |||
| }).bind(this); | |||
| GlobalEvents.listen("change_surface", handle_change_surface); | |||
| @@ -229,7 +237,7 @@ class CTRLPainter { | |||
| var sy = (e.isCombo) ? Math.floor((this.__brushLastPos[1] - this.__offset[1]) * (1.0 / this.__scale)) : y; | |||
| if (x >= 0 && x < this.__surface.width && y >= 0 && y < this.__surface.height){ | |||
| LineToSurface(sx, sy, x, y, this.__brushColor, this.__brushPalette); | |||
| RenderD(); | |||
| //RenderD(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,8 +1,10 @@ | |||
| import Utils from "/app/js/common/Utils.js" | |||
| import {EventCaller} from "/app/js/common/EventCaller.js" | |||
| export default class ISurface{ | |||
| constructor(){} | |||
| export default class ISurface extends EventCaller{ | |||
| constructor(){ | |||
| super(); | |||
| } | |||
| get width(){return 0;} | |||
| get height(){return 0;} | |||
| @@ -38,9 +38,18 @@ export default class NESBank extends ISurface{ | |||
| this.__RP = []; // Right Patterns (Backgrounds) | |||
| this.__AccessMode = 2; // 0 = Sprites only | 1 = BG only | 2 = Sprites and BG | |||
| var handle_datachanged = function(side){ | |||
| if ((side == 0 && (this.__AccessMode == 0 || this.__AccessMode == 2)) || | |||
| (side == 1 && (this.__AccessMode == 1 || this.__AccessMode == 2))){ | |||
| this.emit("data_changed"); | |||
| } | |||
| } | |||
| for (var i=0; i < 256; i++){ | |||
| this.__LP.push(new NESTile()); | |||
| this.__LP[i].listen("data_changed", handle_datachanged.bind(this, 0)); | |||
| this.__RP.push(new NESTile()); | |||
| this.__RP[i].listen("data_changed", handle_datachanged.bind(this, 1)); | |||
| } | |||
| this.__palette = null; | |||
| @@ -81,6 +90,22 @@ export default class NESBank extends ISurface{ | |||
| return buff; | |||
| } | |||
| set chr(buff){ | |||
| if (!(buff instanceof Uint8Array)) | |||
| throw new TypeError("Expected Uint8Array buffer."); | |||
| if (buff.length !== 8192) | |||
| throw new RangeError("Data buffer has invalid byte length."); | |||
| var offset = 0; | |||
| this.__LP.forEach((i) => { | |||
| i.chr = buff.slice(offset, offset+15); | |||
| offset += 16; | |||
| }); | |||
| this.__RP.forEach((i) => { | |||
| i.chr = buff.slice(offset, offset+15); | |||
| offset += 16; | |||
| }); | |||
| } | |||
| get palette(){return this.__palette;} | |||
| set palette(p){ | |||
| if (p !== null && !(p instanceof NESPalette)) | |||
| @@ -1,4 +1,5 @@ | |||
| import Utils from "/app/js/common/Utils.js"; | |||
| import {EventCaller} from "/app/js/common/EventCaller.js"; | |||
| import NESPalette from "/app/js/models/NESPalette.js"; | |||
| @@ -23,9 +24,13 @@ function BitMask(offset, inv){ | |||
| } | |||
| var BLOCK_CHANGE_EMIT = false; // This will block the "data_changed" event when class is processing | |||
| // lots of changes. | |||
| export default class NESTile{ | |||
| export default class NESTile extends EventCaller{ | |||
| constructor(){ | |||
| super(); | |||
| this.__paletteIndex = 0; | |||
| this.__data = new Uint8Array(16); | |||
| } | |||
| @@ -72,6 +77,8 @@ export default class NESTile{ | |||
| } else { | |||
| obj.__data[8+dindex] &= BitMask(bitoffset, true); | |||
| } | |||
| if (!BLOCK_CHANGE_EMIT) | |||
| obj.emit("data_changed"); | |||
| return true; | |||
| } | |||
| }); | |||
| @@ -91,6 +98,15 @@ export default class NESTile{ | |||
| return new Uint8Array(this.__data); | |||
| } | |||
| set chr(buff){ | |||
| if (!(buff instanceof Uint8Array)) | |||
| throw new TypeError("Expected Uint8Array buffer"); | |||
| if (buff.length !== 16) | |||
| throw new RangeError("Buffer contains invalid byte length."); | |||
| this.__data = new Uint8Array(buff); | |||
| this.emit("data_changed"); | |||
| } | |||
| get base64(){ | |||
| var b = "" | |||
| for (var i = 0; i < this.__data.length; i++) { | |||
| @@ -111,6 +127,7 @@ export default class NESTile{ | |||
| } | |||
| this.__data = bytes; | |||
| this.__paletteIndex = b.charCodeAt(b.length-1); | |||
| this.emit("data_changed"); | |||
| } | |||
| @@ -122,6 +139,7 @@ export default class NESTile{ | |||
| throw new RangeError("Palette index out of bounds."); | |||
| } | |||
| this.__paletteIndex = pi; | |||
| this.emit("data_changed"); | |||
| } | |||
| setPixelIndex(x, y, ci){ | |||
| @@ -146,6 +164,7 @@ export default class NESTile{ | |||
| if (flag >= 1 && flag <= 3){ | |||
| var oldData = this.__data; | |||
| var newData = new Uint8Array(16); | |||
| BLOCK_CHANGE_EMIT = true; | |||
| for (var x = 0; x < 8; x++){ | |||
| for (var y = 0; y < 8; y++){ | |||
| this.__data = oldData; | |||
| @@ -158,6 +177,8 @@ export default class NESTile{ | |||
| ); | |||
| } | |||
| } | |||
| BLOCK_CHANGE_EMIT = false; | |||
| this.emit("data_changed"); | |||
| } | |||
| return this; | |||
| } | |||
| @@ -171,6 +192,7 @@ export default class NESTile{ | |||
| if (!(t instanceof NESTile)) | |||
| throw new TypeError("Expected NESTile object."); | |||
| this.__data.set(t.__data); | |||
| this.emit("data_changed"); | |||
| return this; | |||
| } | |||