@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
55 lines (46 loc) • 1.86 kB
JavaScript
import { v3_dot } from "../../../../../core/geom/vec3/v3_dot.js";
import { PI_RECIPROCAL } from "../../../../../core/math/PI_RECIPROCAL.js";
import { one_pixel_sampler_uint8 } from "../../../texture/sampler/one_pixel_sampler_uint8.js";
import { StandardTexture } from "./StandardTexture.js";
const DEFAULT_DIFFUSE = one_pixel_sampler_uint8([255, 255, 255, 255]);
const DEFAULT_NORMAL = one_pixel_sampler_uint8([127, 127, 255]);
const DEFAULT_EMISSIVE = one_pixel_sampler_uint8([0, 0, 0]);
const DEFAULT_ROUGHNESS = one_pixel_sampler_uint8([255]);
const DEFAULT_METALNESS = one_pixel_sampler_uint8([0]);
let id_counter = 0;
export class StandardMaterial {
id = id_counter++;
diffuse = StandardTexture.from(DEFAULT_DIFFUSE)
normal = StandardTexture.from(DEFAULT_NORMAL)
emissive = StandardTexture.from(DEFAULT_EMISSIVE)
roughness = StandardTexture.from(DEFAULT_ROUGHNESS)
metalness = StandardTexture.from(DEFAULT_METALNESS)
/**
*
* @param {number} incoming_direction_x
* @param {number} incoming_direction_y
* @param {number} incoming_direction_z
* @param {number} normal_x
* @param {number} normal_y
* @param {number} normal_z
* @param {number} outgoing_x
* @param {number} outgoing_y
* @param {number} outgoing_z
* @returns {number}
*/
scattering_pdf(
incoming_direction_x, incoming_direction_y, incoming_direction_z,
normal_x, normal_y, normal_z,
outgoing_x, outgoing_y, outgoing_z,
) {
const cos_theta = v3_dot(
normal_x, normal_y, normal_z,
outgoing_x, outgoing_y, outgoing_z
);
if (cos_theta < 0) {
// clamp rays below horizon
return 0;
}
return cos_theta * PI_RECIPROCAL;
}
}