UNPKG

rl-loadout-lib

Version:

Load Rocket League assets into three.js

95 lines (90 loc) 3.03 kB
"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