Skip to content

Commit

Permalink
Split tilesheet dependencies/spriteGroups into image-based and extrac…
Browse files Browse the repository at this point in the history
…tions
  • Loading branch information
Jbudone committed Feb 10, 2019
1 parent 3630f2c commit c4b760a
Show file tree
Hide file tree
Showing 4 changed files with 596 additions and 285 deletions.
151 changes: 91 additions & 60 deletions resourceBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,20 +255,42 @@ const packageRoutines = {
generatedSheet.dirty = sheet.dirty;
generatedSheet.columns = sheet.columns;
generatedSheet.rows = sheet.rows;

// Image dependencies are separate from extraction groups, but still go on the currentList
sheet.dependencies.forEach((dep) => {
if (dep.imageSrc) {
if (!generatedSheet.currentList) generatedSheet.currentList = [];
generatedSheet.currentList.push(dep);
}
});
}
});

// Mark generated sheets as dirty if lists differ
_.forEach(generatedSheets, (sheet, sheetId) => {

if (sheet.list && sheet.currentList && (sheet.currentList.length === sheet.list.length)) {
if (!sheet.dirty && sheet.list && sheet.currentList && (sheet.currentList.length === sheet.list.length)) {
for (let i = 0; i < sheet.currentList.length; ++i) {
const newAsset = sheet.currentList[i],
oldAsset = sheet.list.find((a) => a.assetId === newAsset.assetId);

if (!oldAsset || !_.isEqual(newAsset.sprites, oldAsset.sprites)) {
sheet.dirty = true;
break;

const item = sheet.currentList[i];
if (item.imageSrc) {
// Image dependency
// Has the image changed?
const imageSrcHash = item.imageSrcHash; // FIXME
if (imageSrcHash !== item.imageSrcHash) {
sheet.dirty = true;
}
} else {
// Extraction group
// Have any of the assets changed amongst this group?
const newAsset = item,
oldAsset = sheet.list.find((a) => a.assetId === newAsset.assetId);

if (!oldAsset || !_.isEqual(newAsset.sprites, oldAsset.sprites)) {
sheet.dirty = true;
break;
}
}
}
} else {
Expand Down Expand Up @@ -332,6 +354,7 @@ const packageRoutines = {
newDependencies: sheet.newDependencies,
oldSprites: sheet.oldSprites,
sprites: sheet.sprites,
spriteGroups: sheet.spriteGroups,
tilesize: sheet.tilesize,
sheetType: 'generatedTilesheet',
columns: sheet.columns,
Expand Down Expand Up @@ -1037,15 +1060,31 @@ const processGeneratedTilesheet = (package) => {
const oldSprites = package.oldSprites,
modifiedSprites = package.sprites;

const oldSpriteGroups = package.spriteGroups;

package.dependencies = [];
package.sprites = [];

let spritesToExtract = [],
imagesToExtract = [],
yOffset = 0,
genMaxX = 0,
genMaxY = 0,
spriteGroups = [];
newDependencies.forEach((dependency) => {

const extractionDeps = [],
imageDeps = [];

newDependencies.forEach((dep) => {
if (dep.imageSrc) {
imageDeps.push(dep);
} else {
extractionDeps.push(dep);
}
});


extractionDeps.forEach((dependency) => {

const source = dependency.asset.image,
columns = parseInt(dependency.asset.columns, 10),
Expand Down Expand Up @@ -1154,6 +1193,7 @@ const processGeneratedTilesheet = (package) => {
sprites: dependency.sprites
});

debugger; // FIXME: We want to copy spriteGroup over
spriteIslands.forEach((spriteIsland) => {
spriteGroups.push({
spriteIsland
Expand All @@ -1162,11 +1202,11 @@ const processGeneratedTilesheet = (package) => {
});

// Append to package.sprites for image based deps
// Should have a different newDependencies list to process as opposed to checking oldDeps here
oldDependencies.forEach((dependency) => {
if (!dependency.imageSrc) return;
imageDeps.forEach((dependency) => {
package.dependencies.push(dependency);

const spriteGroup = oldSpriteGroups.find((spriteGroup) => spriteGroup.imageSrc === dependency.imageSrc);

const relSource = "../" + dependency.previewSrc;

// Does relSource exist? If not then we need to create it first
Expand All @@ -1180,58 +1220,23 @@ const processGeneratedTilesheet = (package) => {
maxY = 0,
maxX = 0;

const spriteIsland = [];
modifiedSprites.forEach((sprite) => {
if (sprite.source !== dependency.imageSrc) return;

package.sprites.push({
source: sprite.source,
sprite: -1,
dstX: sprite.dstX,
dstY: sprite.dstY,
srcX: sprite.srcX,
srcY: sprite.srcY
});

let x = sprite.srcX,
y = sprite.srcY;

minY = Math.min(minY, y);
minX = Math.min(minX, x);
maxY = Math.max(maxY, y);
maxX = Math.max(maxX, x);

let srcX = Math.floor(x / package.tilesize),
srcY = Math.floor(y / package.tilesize),
dstX = Math.floor(sprite.dstX / package.tilesize),
dstY = Math.floor(sprite.dstY / package.tilesize);

// Each dependency is an island
spriteIsland.push({
sprite: sprite.source,
srcX, srcY,
dstX, dstY
});

// FIXME: We should only ever need to extract the entire image, not each individual sprite
// Have an imagesToExtract list which are treated different than spritesToExtract
spritesToExtract.push({
source: relSource,
srcX: x,
srcY: y,
srcW: package.tilesize,
srcH: package.tilesize,
dstX: sprite.dstX,
dstY: sprite.dstY
});

imagesToExtract.push({
source: relSource,
dstX: spriteGroup.dstX,
dstY: spriteGroup.dstY,
});


genMaxY += (maxY - minY + 1);
genMaxX = Math.max(genMaxX, maxX - minX + 1);


spriteGroups.push({
spriteIsland
imageSrc: spriteGroup.imageSrc,
dstX: spriteGroup.dstX,
dstY: spriteGroup.dstY,
width: spriteGroup.width,
height: spriteGroup.height
});
});

Expand All @@ -1241,6 +1246,8 @@ const processGeneratedTilesheet = (package) => {
console.log(` Height: ${package.tilesize * genMaxY}`);
console.log(` Sprites:`);
console.log(spritesToExtract);
console.log(` Images:`);
console.log(imagesToExtract);

console.log(oldDependencies);
console.log(oldSprites);
Expand Down Expand Up @@ -1269,6 +1276,18 @@ const processGeneratedTilesheet = (package) => {
maxDstY = Math.max(maxDstY, y);
maxDstX = Math.max(maxDstX, x);
});

spriteGroups.forEach((spriteGroup) => {
if (spriteGroup.imageSrc) {
let x = spriteGroup.dstX,
y = spriteGroup.dstY;

minDstY = Math.min(minDstY, y);
minDstX = Math.min(minDstX, x);
maxDstY = Math.max(maxDstY, y);
maxDstX = Math.max(maxDstX, x);
}
});


const newColumns = maxDstX - minDstX + 1,
Expand All @@ -1290,10 +1309,16 @@ const processGeneratedTilesheet = (package) => {

// Translate sprite in spriteIsland
spriteGroups.forEach((sg) => {
sg.spriteIsland.forEach((s) => {
s.dstX -= minDstX;
s.dstY -= minDstY;
});

if (sg.spriteIsland) {
sg.spriteIsland.forEach((s) => {
s.dstX -= minDstX;
s.dstY -= minDstY;
});
} else {
sg.dstX -= minDstX;
sg.dstY -= minDstY;
}
});
}

Expand Down Expand Up @@ -1356,6 +1381,12 @@ const processGeneratedTilesheet = (package) => {
convertCmd += `\\( resources/${sprite.source} -crop ${sprite.srcW}x${sprite.srcH}+${sprite.srcX}+${sprite.srcY} -filter box -resize ${package.tilesize}x${package.tilesize} -repage ${curX >= 0 ? '+' : '-'}${curX}${curY >= 0 ? '+' : '-'}${curY} \\) `;
});

imagesToExtract.forEach((img) => {
const dstX = img.dstX,
dstY = img.dstY;
convertCmd += `\\( resources/${img.source} -filter box -repage ${dstX >= 0 ? '+' : '-'}${dstX}${dstY >= 0 ? '+' : '-'}${dstY} \\) `;
});

convertCmd += `-background none -layers merge ${package.output}`;
console.log(convertCmd);

Expand Down
2 changes: 1 addition & 1 deletion tools/toolbelt/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<link rel="stylesheet" type="text/css" href="style.css">

<script type="text/javascript" src="/js/lib/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/js/lib/underscore-min.js"></script>
<script type="text/javascript" src="/js/lib/lodash.js"></script>
<script src="js/main.js"></script>
<script src="js/resourcemgr.js"></script>
<script src="js/interactionmgr.js"></script>
Expand Down
3 changes: 2 additions & 1 deletion tools/toolbelt/js/interactionmgr.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,8 @@ const InteractionMgr = (new function(){

// Functions
setCanDrag: (canDrag) => { interaction.canDrag = true; return interactionFunctions; },
move: (x, y) => { interaction.x = x; interaction.y = y; return interactionFunctions; }
move: (x, y) => { interaction.x = x; interaction.y = y; return interactionFunctions; },
remove: () => { const idx = interactables.findIndex((ent) => ent === interaction); interactables.splice(idx, 1); }
};

interactables.push(interaction);
Expand Down
Loading

0 comments on commit c4b760a

Please sign in to comment.