UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

55 lines (46 loc) 1.86 kB
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; } }