Add shrike model and skin

This commit is contained in:
Brian Beck 2022-12-24 16:57:38 -08:00
parent 355ec1f2d5
commit 2eb3060afc
8 changed files with 83 additions and 32 deletions

View file

@ -28,6 +28,8 @@ const weaponModels = [
"targeting", "targeting",
]; ];
const vehicleModels = ["vehicle_air_scout"];
export async function getSkinConfig() { export async function getSkinConfig() {
const [defaultSkins, customSkins, customWeaponSkins] = await Promise.all([ const [defaultSkins, customSkins, customWeaponSkins] = await Promise.all([
Promise.all( Promise.all(
@ -101,6 +103,8 @@ export async function getSkinConfig() {
shocklance: "weapon_shocklance", shocklance: "weapon_shocklance",
sniper: "weapon_sniper", sniper: "weapon_sniper",
targeting: "weapon_targeting", targeting: "weapon_targeting",
// Vehicles
vehicle_air_scout: "vehicle_air_scout",
}, },
animationLabels: { animationLabels: {
Forward: "Run Forward", Forward: "Run Forward",
@ -259,6 +263,34 @@ export async function getSkinConfig() {
mortar: [{ label: "Weapon", name: "weapon_mortar" }], mortar: [{ label: "Weapon", name: "weapon_mortar" }],
repair: [{ label: "Weapon", name: "weapon_repair" }], repair: [{ label: "Weapon", name: "weapon_repair" }],
targeting: [{ label: "Weapon", name: "weapon_targeting" }], targeting: [{ label: "Weapon", name: "weapon_targeting" }],
// Vehicles
vehicle_air_scout: [
{
label: "Vehicle",
name: "vehicle_air_scout0",
file: "vehicle_air_scout",
},
{
name: "Unassigned",
hidden: true,
hasDefault: false,
},
{
name: "vehicle_air_scout",
hidden: true,
hasDefault: false,
},
{
label: "Flare",
name: "shrikeflare2",
emissiveFactor: [0, 0, 0],
alphaMode: "BLEND",
emissiveTexture: true,
metallicFactor: 0,
roughnessFactor: 1,
size: [256, 256],
},
],
}, },
animations: { animations: {
global: [ global: [

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

Binary file not shown.

View file

@ -20,7 +20,7 @@ export default function MaterialSelector() {
}} }}
> >
{materialDefs.map((materialDef, i) => {materialDefs.map((materialDef, i) =>
materialDef ? ( materialDef && !materialDef.hidden ? (
<option key={materialDef.name} value={i}> <option key={materialDef.name} value={i}>
{materialDef.label ?? materialDef.name} {materialDef.label ?? materialDef.name}
</option> </option>

View file

@ -208,45 +208,59 @@ export default function ToolsProvider({ children }: { children: ReactNode }) {
name = name.trim() || "MyCustomSkin"; name = name.trim() || "MyCustomSkin";
const materialExports = await Promise.all( const materialExports = await Promise.all(
materialDefs.map(async (materialDef: MaterialDefinition) => { materialDefs
const colorCanvas = canvases[`${materialDef.name}:color`]?.canvas; .filter(
const metallicCanvas = (materialDef: MaterialDefinition) =>
canvases[`${materialDef.name}:metallic`]?.canvas; materialDef && !materialDef.hidden
)
.map(async (materialDef: MaterialDefinition) => {
const colorCanvas = canvases[`${materialDef.name}:color`]?.canvas;
const metallicCanvas =
canvases[`${materialDef.name}:metallic`]?.canvas;
const textureSize = materialDef.size ?? [512, 512]; const textureSize = materialDef.size ?? [512, 512];
let outputImageUrl; let outputImageUrl;
const colorImageUrl = colorCanvas.toDataURL({ const colorImageUrl = colorCanvas.toDataURL({
top: canvasPadding,
left: canvasPadding,
width: textureSize[0],
height: textureSize[1],
});
if (metallicCanvas) {
const metallicImageUrl = metallicCanvas.toDataURL({
top: canvasPadding, top: canvasPadding,
left: canvasPadding, left: canvasPadding,
width: textureSize[0], width: textureSize[0],
height: textureSize[1], height: textureSize[1],
}); });
outputImageUrl = await combineColorAndAlphaImageUrls({
colorImageUrl,
metallicImageUrl,
});
} else {
outputImageUrl = colorImageUrl;
}
const filename = if (metallicCanvas) {
selectedModelType === "player" const metallicImageUrl = metallicCanvas.toDataURL({
? `${name}.${actualModel}.png` top: canvasPadding,
: materialDef left: canvasPadding,
? `${materialDef.file ?? materialDef.name}.png` width: textureSize[0],
: `weapon_${actualModel}.png`; height: textureSize[1],
});
outputImageUrl = await combineColorAndAlphaImageUrls({
colorImageUrl,
metallicImageUrl,
});
} else {
outputImageUrl = colorImageUrl;
}
return { imageUrl: outputImageUrl, filename }; let filename;
}) switch (selectedModelType) {
case "player":
filename = `${name}.${actualModel}.png`;
break;
case "weapon":
case "vehicle":
if (materialDef) {
filename = `${materialDef.file ?? materialDef.name}.png`;
} else if (selectedModelType === "weapon") {
filename = `weapon_${actualModel}.png`;
} else {
filename = `${actualModel}.png`;
}
}
return { imageUrl: outputImageUrl, filename };
})
); );
switch (format) { switch (format) {

View file

@ -34,6 +34,7 @@ export function getSkinImageUrls({
} }
break; break;
case "weapon": case "weapon":
case "vehicle":
return materialDefs.reduce( return materialDefs.reduce(
( (
skinImageUrls: Record<string, string>, skinImageUrls: Record<string, string>,

View file

@ -84,6 +84,9 @@ export default function WarriorSelector() {
<option value="repair">Repair Pack</option> <option value="repair">Repair Pack</option>
<option value="targeting">Targeting Laser</option> <option value="targeting">Targeting Laser</option>
</optgroup> </optgroup>
<optgroup label="Vehicles" data-model-type="vehicle">
<option value="vehicle_air_scout">Shrike</option>
</optgroup>
</select> </select>
</div> </div>
<div className="Field"> <div className="Field">
@ -125,7 +128,8 @@ export default function WarriorSelector() {
</optgroup> </optgroup>
</> </>
) : null} ) : null}
{selectedModelType === "weapon" ? ( {selectedModelType === "weapon" ||
selectedModelType === "vehicle" ? (
<> <>
{modelDefaults[actualModel] ? ( {modelDefaults[actualModel] ? (
<optgroup label="Default Skins" data-skin-type="default"> <optgroup label="Default Skins" data-skin-type="default">