rl-loadout-lib
Version:
Load Rocket League assets into three.js
95 lines (90 loc) • 3.03 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const three_1 = require("three");
const offscreen_canvas_1 = require("../utils/offscreen-canvas");
const extended_mesh_standard_material_1 = require("./extended-mesh-standard-material");
const UNIFORMS = `
uniform sampler2D rgbaMap;
uniform vec3 accentColor;
uniform vec3 paintColor;
uniform int painted;
uniform int hasAlpha;
`;
const DIFFUSE_SHADER = `
// Get color from base map
vec4 texelColor = texture2D(map, vUv);
// get color from rgba map
vec4 rgbaMapColor = texture2D(rgbaMap, vUv);
if (painted == 1) {
texelColor.rgb = blendNormal(texelColor.rgb, paintColor.rgb, rgbaMapColor.r);
}
// accent color on body
if (hasAlpha == 1) {
texelColor.rgb = blendNormal(texelColor.rgb, accentColor.rgb, texelColor.a);
}
texelColor = mapTexelToLinear(texelColor);
diffuseColor *= texelColor;
`;
class ChassisMaterial extends extended_mesh_standard_material_1.ExtendedMeshStandardMaterial {
constructor() {
super();
this.paintable = false;
this.fragmentShader = extended_mesh_standard_material_1.ExtendedMeshStandardMaterial.createFragmentShader(UNIFORMS, DIFFUSE_SHADER);
this.uniforms.rgbaMap = { value: null };
this.uniforms.accentColor = { value: new three_1.Color() };
this.uniforms.paintColor = { value: new three_1.Color() };
this.uniforms.painted = { value: 0 };
this.uniforms.hasAlpha = { value: 0 };
}
get map() {
return this.uniforms.map.value;
}
set map(map) {
this.uniforms.map.value = map;
this.uniforms.hasAlpha.value = hasAlpha(map.image) ? 1 : 0;
}
get rgbaMap() {
return this.uniforms.rgbaMap.value;
}
set rgbaMap(rgbaMap) {
this.uniforms.rgbaMap.value = rgbaMap;
}
get accentColor() {
return this.uniforms.accentColor.value;
}
set accentColor(accentColor) {
if (accentColor != undefined) {
this.uniforms.accentColor.value.copy(accentColor);
}
else {
this.uniforms.accentColor.value.setRGB(0, 0, 0);
}
}
get paintColor() {
return this.uniforms.paintColor.value;
}
set paintColor(paintColor) {
if (paintColor != undefined) {
this.uniforms.paintColor.value.copy(paintColor);
this.uniforms.painted.value = this.paintable ? 1 : 0;
}
else {
this.uniforms.painted.value = 0;
}
}
}
exports.ChassisMaterial = ChassisMaterial;
// so hacky
function hasAlpha(image) {
const canvas = offscreen_canvas_1.createOffscreenCanvas(image.width, image.height);
const ctx = canvas.getContext('2d');
ctx.drawImage(image, 0, 0);
const data = ctx.getImageData(0, 0, image.width, image.height).data;
for (let i = 0; i < data.length; i += 4) {
if (data[i + 3] === 0) {
return true;
}
}
return false;
}
//# sourceMappingURL=chassis-material.js.map