1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-13 09:29:35 +00:00

asmmain.js; fixed disappearing pixel editor bug (?)

This commit is contained in:
Steven Hugg 2019-04-13 09:10:08 -04:00
parent b2264d75cf
commit 9108bb5e1c
4 changed files with 80 additions and 20 deletions

View File

@ -102,7 +102,6 @@ TODO:
- pulldown shows wrong file if preset not present - pulldown shows wrong file if preset not present
- landscape mode for arcade ports - landscape mode for arcade ports
- pixel editor - pixel editor
- edit sprites and tiles at same time (multiple views)
- persist palette/tilemap selections - persist palette/tilemap selections
- more tools for editing - more tools for editing
- map editor - map editor
@ -111,7 +110,6 @@ TODO:
- capture so we get mouseUp() out of frame - capture so we get mouseUp() out of frame
- per-View keyboard shortcuts - per-View keyboard shortcuts
- parse labels - parse labels
- editing too fast refreshes kills the editor, also doesn't update palette
- crt0.s compiled each time? - crt0.s compiled each time?
- debug highlight doesn't go away when debugging -> running - debug highlight doesn't go away when debugging -> running
- show breakpoint of PC or highest address on stack - show breakpoint of PC or highest address on stack

View File

@ -8,7 +8,7 @@ export type UintArray = number[] | Uint8Array | Uint16Array | Uint32Array; //{[i
// TODO: separate view/controller // TODO: separate view/controller
export interface EditorContext { export interface EditorContext {
setCurrentEditor(div:JQuery, editing:JQuery) : void; setCurrentEditor(div:JQuery, editing:JQuery, node:PixNode) : void;
getPalettes(matchlen : number) : SelectablePalette[]; getPalettes(matchlen : number) : SelectablePalette[];
getTilemaps(matchlen : number) : SelectableTilemap[]; getTilemaps(matchlen : number) : SelectableTilemap[];
} }
@ -807,7 +807,7 @@ export class CharmapEditor extends PixNode {
chooser.recreate(agrid, (index, viewer) => { chooser.recreate(agrid, (index, viewer) => {
var escale = Math.ceil(192 / this.fmt.w); var escale = Math.ceil(192 / this.fmt.w);
var editview = this.createEditor(aeditor, viewer, escale); var editview = this.createEditor(aeditor, viewer, escale);
this.context.setCurrentEditor(aeditor, $(viewer.canvas)); this.context.setCurrentEditor(aeditor, $(viewer.canvas), this);
this.rgbimgs[index] = viewer.rgbdata; this.rgbimgs[index] = viewer.rgbdata;
}); });
// add palette selector // add palette selector

View File

@ -906,6 +906,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
maindiv : JQuery; maindiv : JQuery;
cureditordiv : JQuery; cureditordiv : JQuery;
cureditelem : JQuery; cureditelem : JQuery;
cureditnode : pixed.PixNode;
rootnodes : pixed.PixNode[]; rootnodes : pixed.PixNode[];
deferrednodes : pixed.PixNode[]; deferrednodes : pixed.PixNode[];
@ -979,8 +980,16 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
}); });
return result; return result;
} }
isEditing() {
return this.cureditordiv != null;
}
getCurrentEditNode() {
return this.cureditnode;
}
setCurrentEditor(div : JQuery, editing : JQuery) { setCurrentEditor(div:JQuery, editing:JQuery, node:pixed.PixNode) {
const timeout = 250; const timeout = 250;
if (this.cureditordiv != div) { if (this.cureditordiv != div) {
if (this.cureditordiv) { if (this.cureditordiv) {
@ -1002,6 +1011,10 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
this.cureditelem = editing; this.cureditelem = editing;
this.cureditelem.addClass('selected'); this.cureditelem.addClass('selected');
} }
while (node.left) {
node = node.left;
}
this.cureditnode = node;
} }
scanFileTextForAssets(id : string, data : string) { scanFileTextForAssets(id : string, data : string) {
@ -1055,6 +1068,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
return result; return result;
} }
// TODO: move to pixeleditor.ts?
addPaletteEditorViews(parentdiv:JQuery, pal2rgb:pixed.PaletteFormatToRGB, callback) { addPaletteEditorViews(parentdiv:JQuery, pal2rgb:pixed.PaletteFormatToRGB, callback) {
var adual = $('<div class="asset_dual"/>').appendTo(parentdiv); var adual = $('<div class="asset_dual"/>').appendTo(parentdiv);
var aeditor = $('<div class="asset_editor"/>').hide(); // contains editor, when selected var aeditor = $('<div class="asset_editor"/>').hide(); // contains editor, when selected
@ -1100,7 +1114,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
callback(i, index); callback(i, index);
updateCell(cell, i); updateCell(cell, i);
}); });
this.setCurrentEditor(aeditor, cell); this.setCurrentEditor(aeditor, cell, pal2rgb);
}); });
}); });
} }
@ -1139,9 +1153,19 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
}); });
} }
ensureFileDiv(fileid : string) : JQuery<HTMLElement> {
var divid = this.getFileDivId(fileid);
var body = $(document.getElementById(divid));
if (body.length === 0) {
var filediv = newDiv(this.maindiv, 'asset_file');
var header = newDiv(filediv, 'asset_file_header').text(fileid);
body = newDiv(filediv).attr('id',divid).addClass('disable-select');
}
return body;
}
refreshAssetsInFile(fileid : string, data : FileData) : number { refreshAssetsInFile(fileid : string, data : FileData) : number {
let nassets = 0; let nassets = 0;
let filediv = $('#'+this.getFileDivId(fileid)).empty();
// TODO: check fmt w/h/etc limits // TODO: check fmt w/h/etc limits
// TODO: defer editor creation // TODO: defer editor creation
// TODO: only refresh when needed // TODO: only refresh when needed
@ -1149,7 +1173,7 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
// is this a NES CHR? // is this a NES CHR?
let node = new pixed.FileDataNode(projectWindows, fileid); let node = new pixed.FileDataNode(projectWindows, fileid);
const neschrfmt = {w:8,h:8,bpp:1,count:(data.length>>4),brev:true,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}; // TODO const neschrfmt = {w:8,h:8,bpp:1,count:(data.length>>4),brev:true,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}; // TODO
this.addPixelEditor(filediv, node, neschrfmt); this.addPixelEditor(this.ensureFileDiv(fileid), node, neschrfmt);
this.registerAsset("charmap", node, true); this.registerAsset("charmap", node, true);
nassets++; nassets++;
} else if (typeof data === 'string') { } else if (typeof data === 'string') {
@ -1168,19 +1192,19 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
node = node.addRight(new pixed.NESNametableConverter(this)); // TODO? node = node.addRight(new pixed.NESNametableConverter(this)); // TODO?
node = node.addRight(new pixed.Palettizer(this, {w:8,h:8,bpp:4})); // TODO? node = node.addRight(new pixed.Palettizer(this, {w:8,h:8,bpp:4})); // TODO?
const fmt = {w:8*32,h:8*30,count:1}; // TODO const fmt = {w:8*32,h:8*30,count:1}; // TODO
node = node.addRight(new pixed.CharmapEditor(this, newDiv(filediv), fmt)); node = node.addRight(new pixed.CharmapEditor(this, newDiv(this.ensureFileDiv(fileid)), fmt));
this.registerAsset("nametable", first, true); this.registerAsset("nametable", first, true);
nassets++; nassets++;
} }
// is this a bitmap? // is this a bitmap?
else if (frag.fmt.w > 0 && frag.fmt.h > 0) { else if (frag.fmt.w > 0 && frag.fmt.h > 0) {
this.addPixelEditor(filediv, node, frag.fmt); this.addPixelEditor(this.ensureFileDiv(fileid), node, frag.fmt);
this.registerAsset("charmap", first, true); this.registerAsset("charmap", first, true);
nassets++; nassets++;
} }
// is this a palette? // is this a palette?
else if (frag.fmt.pal) { else if (frag.fmt.pal) {
this.addPaletteEditor(filediv, node, frag.fmt); this.addPaletteEditor(this.ensureFileDiv(fileid), node, frag.fmt);
this.registerAsset("palette", first, false); this.registerAsset("palette", first, false);
nassets++; nassets++;
} }
@ -1200,28 +1224,28 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
// TODO: recreate editors when refreshing // TODO: recreate editors when refreshing
// TODO: look for changes, not moveCursor // TODO: look for changes, not moveCursor
refresh(moveCursor : boolean) { refresh(moveCursor : boolean) {
// clear and refresh all files/nodes?
if (moveCursor) { if (moveCursor) {
this.maindiv.empty(); this.maindiv.empty();
this.clearAssets(); this.clearAssets();
current_project.iterateFiles((id, data) => { current_project.iterateFiles((fileid, data) => {
var divid = this.getFileDivId(id);
var filediv = newDiv(this.maindiv, 'asset_file');
var header = newDiv(filediv, 'asset_file_header').text(id);
var body = newDiv(filediv).attr('id',divid).addClass('disable-select');
try { try {
var nassets = this.refreshAssetsInFile(id, data); var nassets = this.refreshAssetsInFile(fileid, data);
if (nassets == 0) filediv.hide();
} catch (e) { } catch (e) {
console.log(e); console.log(e);
filediv.text(e+""); // TODO: error msg? this.ensureFileDiv(fileid).text(e+""); // TODO: error msg?
} }
}); });
console.log("Found " + this.rootnodes.length + " assets"); console.log("Found " + this.rootnodes.length + " assets");
this.deferrednodes.forEach((node) => { node.refreshRight(); }); this.deferrednodes.forEach((node) => { node.refreshRight(); });
this.deferrednodes = []; this.deferrednodes = [];
} else { } else {
// only refresh nodes if not actively editing
// since we could be in the middle of an operation that hasn't been committed
for (var node of this.rootnodes) { for (var node of this.rootnodes) {
node.refreshRight(); if (node !== this.getCurrentEditNode()) {
node.refreshRight();
}
} }
} }
} }

38
src/worker/asmmain.js Normal file
View File

@ -0,0 +1,38 @@
var asmmod = require('../../gen/worker/assembler');
var fs = require('fs');
var args = process.argv;
if (args.length < 3) {
console.log("Usage: asmmain config.json [file.asm...]");
process.exit(1);
}
// load JSON config
var configFilename = args[2];
var configFile = fs.readFileSync(configFilename, 'utf8');
var configJson = JSON.parse(configFile);
var binout = [];
for (var fi=3; fi<args.length; fi++) {
// assemble file
var asmFilename = args[fi];
var asm = new asmmod.Assembler(configJson);
asm.loadInclude = function(fn) { };
asm.loadModule = function(fn) { };
var asmtext = fs.readFileSync(asmFilename, 'utf8');
var out = asm.assembleFile(asmtext);
if (out.errors && out.errors.length) {
for (var ei=0; ei<out.errors.length; ei++) {
var err = out.errors[ei];
console.log(asmFilename + "(" + err.line + "): " + err.msg);
}
process.exit(2);
}
binout = binout.concat(out.output);
}
// print output
for (var i=0; i<binout.length; i++) {
console.log(binout[i].toString(16));
}