mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
104 lines
3.8 KiB
JavaScript
104 lines
3.8 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
function generateInclude(outputLocation, headerLocation) {
|
|
return `#include "${path.relative(path.dirname(outputLocation), headerLocation)}"`
|
|
}
|
|
|
|
const InvalidTokenCharacter = /[^A-Za-z0-9_]/gim;
|
|
|
|
function getSegmentName(headerLocation) {
|
|
const levelName = path.basename(headerLocation);
|
|
const noExtension = levelName.slice(0, levelName.length - path.extname(levelName).length);
|
|
|
|
return noExtension.replace(InvalidTokenCharacter, '_');
|
|
}
|
|
|
|
function generateArmatureName(outputLocation, headerLocation) {
|
|
const relative = path.relative(path.dirname(outputLocation), headerLocation).slice(0, -2);
|
|
return relative.replace(InvalidTokenCharacter, '_') + '_armature';
|
|
}
|
|
|
|
function generateClipsName(outputLocation, headerLocation) {
|
|
const relative = path.relative(path.dirname(outputLocation), headerLocation).slice(0, -2);
|
|
return relative.replace(InvalidTokenCharacter, '_') + '_clips';
|
|
}
|
|
|
|
function generateClipCountName(outputLocation, headerLocation) {
|
|
const relative = path.relative(path.dirname(outputLocation), headerLocation).slice(0, -2);
|
|
return relative.replace(InvalidTokenCharacter, '_').toUpperCase() + '_CLIP_COUNT';
|
|
}
|
|
|
|
function generateDynamicModelName(outputLocation, headerLocation, index) {
|
|
const relative = path.relative(path.dirname(outputLocation), headerLocation).slice(0, -2);
|
|
return relative.replace(InvalidTokenCharacter, '_') + '_DYNAMIC_ANIMATED_MODEL';
|
|
}
|
|
|
|
function generateMetadata(outputLocation, headerLocation) {
|
|
const segmentName = getSegmentName(headerLocation);
|
|
return ` {
|
|
_${segmentName}_geoSegmentRomStart,
|
|
_${segmentName}_geoSegmentRomEnd,
|
|
_${segmentName}_geoSegmentStart,
|
|
&${generateArmatureName(outputLocation, headerLocation)},
|
|
${generateClipsName(outputLocation, headerLocation)},
|
|
${generateClipCountName(outputLocation, headerLocation)},
|
|
"${segmentName}",
|
|
},`;
|
|
}
|
|
|
|
function generateExterns(headerLocation) {
|
|
const segmentName = getSegmentName(headerLocation);
|
|
return `
|
|
extern char _${segmentName}_geoSegmentRomStart[];
|
|
extern char _${segmentName}_geoSegmentRomEnd[];
|
|
extern char _${segmentName}_geoSegmentStart[];
|
|
`;
|
|
|
|
}
|
|
|
|
function generateModelList(outputLocation, headerLocations) {
|
|
return `struct DynamicAnimatedAssetModel gDynamicAnimatedModels[] = {
|
|
${headerLocations.map(headerLocation => generateMetadata(outputLocation, headerLocation)).join('\n')}
|
|
};`
|
|
}
|
|
|
|
function generateMetadataDeclaration(outputLocation, headerLocation, index) {
|
|
const segmentName = getSegmentName(headerLocation);
|
|
return `#define ${generateDynamicModelName(outputLocation, headerLocation).toUpperCase()} ${index}`;
|
|
}
|
|
|
|
function generateModelHeaderList(outputLocation, headerLocations) {
|
|
return headerLocations.map((headerLocation, index) => generateMetadataDeclaration(outputLocation, headerLocation, index)).join('\n');
|
|
}
|
|
|
|
function generateData(outputLocation, headerLocations) {
|
|
return `#ifndef __DYNAMIC_ANIMATED_MODEL_LIST_DATA_H__
|
|
#define __DYNAMIC_ANIMATED_MODEL_LIST_DATA_H__
|
|
|
|
#include "util/dynamic_asset_loader.h"
|
|
|
|
${headerLocations.map(headerLocation => generateInclude(outputLocation, headerLocation)).join('\n')}
|
|
|
|
${headerLocations.map(generateExterns).join('\n')}
|
|
|
|
${generateModelList(outputLocation, headerLocations)}
|
|
|
|
#endif
|
|
`;
|
|
}
|
|
|
|
function generateHeader(outputLocation, headerLocations) {
|
|
return `#ifndef __DYNAMIC_ANIMATED_MODEL_LIST_DEFINITION_H__
|
|
#define __DYNAMIC_ANIMATED_MODEL_LIST_DEFINITION_H__
|
|
|
|
#define DYNAMIC_ANIMATED_MODEL_COUNT ${headerLocations.length}
|
|
|
|
${generateModelHeaderList(outputLocation, headerLocations)}
|
|
|
|
#endif
|
|
`;
|
|
}
|
|
|
|
fs.writeFileSync(process.argv[2], generateHeader(process.argv[2], process.argv.slice(4)));
|
|
fs.writeFileSync(process.argv[3], generateData(process.argv[3], process.argv.slice(4))); |