Source file: /examples/material/standard/basic.js
import { GUI } from "dat.gui"
import {
MeshMaterial3D,
DirectionalLight,
WebGLRenderer,
TextureLoader,
PerspectiveProjection,
Camera,
WebGLRenderDevice,
CuboidMeshBuilder,
MeshMaterialPlugin,
StandardMaterial,
UVSphereMeshBuilder,
OrbitCameraControls,
SkyBox,
TextureType,
LightPlugin,
AmbientLight,
CanvasTarget,
SkyboxPlugin,
CameraPlugin
} from "webgllis"
const canvas = document.createElement('canvas')
const renderTarget = new CanvasTarget(canvas)
const renderDevice = new WebGLRenderDevice(canvas,{
depth:true
})
const renderer = new WebGLRenderer({
plugins: [
new LightPlugin(),
new SkyboxPlugin(),
new MeshMaterialPlugin(),
new CameraPlugin()
]
})
const camera = new Camera(renderTarget)
const cameraControls = new OrbitCameraControls(camera, canvas)
// lights
const ambientLight = new AmbientLight()
const directionalLight = new DirectionalLight()
directionalLight.transform.orientation
.rotateX(-Math.PI / 4)
.rotateZ(-Math.PI / 4)
directionalLight.intensity = 10
ambientLight.intensity = 0.3
const textureLoader = new TextureLoader()
const texture = textureLoader.load({
paths: ["/assets/images/uv.jpg"],
textureSettings: {
flipY: true
}
})
const day = textureLoader.load({
paths: [
"/assets/images/skybox/miramar_right.png",
"/assets/images/skybox/miramar_left.png",
"/assets/images/skybox/miramar_top.png",
"/assets/images/skybox/miramar_bottom.png",
"/assets/images/skybox/miramar_back.png",
"/assets/images/skybox/miramar_front.png",
],
type: TextureType.TextureCubeMap,
})
const material = new StandardMaterial({
mainTexture: texture
})
const object1 = new MeshMaterial3D(new CuboidMeshBuilder().build(), material)
const object2 = new MeshMaterial3D(new UVSphereMeshBuilder().build(), material)
const skyBox = new SkyBox({
day
})
object1.transform.position.x = -1
object2.transform.position.x = 1
skyBox.transform.orientation.rotateY(Math.PI)
//set up the camera
cameraControls.distance = 2.5
if (camera.projection instanceof PerspectiveProjection) {
camera.projection.fov = Math.PI / 180 * 75
camera.projection.aspect = innerWidth / innerHeight
}
document.body.append(canvas)
updateView()
addEventListener("resize", updateView)
requestAnimationFrame(update)
function update() {
object1.transform.orientation
.rotateX(Math.PI / 1000)
.rotateY(Math.PI / 1000)
object2.transform.orientation
.rotateX(Math.PI / 1000)
.rotateY(Math.PI / 1000)
renderer.render([object1, object2, skyBox, ambientLight, directionalLight, camera], renderDevice)
cameraControls.update()
requestAnimationFrame(update)
}
function updateView() {
canvas.style.width = innerWidth + "px"
canvas.style.height = innerHeight + "px"
canvas.width = innerWidth * devicePixelRatio
canvas.height = innerHeight * devicePixelRatio
if (camera.projection instanceof PerspectiveProjection) {
camera.projection.aspect = innerWidth / innerHeight
}
}
// gui controls
const settings = {
dummy: {
r: 0,
g: 0,
b: 0,
a: 0
}
}
const controls = new GUI()
const buildOptionsFolder = controls.addFolder("Settings")
buildOptionsFolder
.addColor(settings, 'dummy')
.name('Base Color')
.onChange((value) => {
material.color.set(
value.r / 255,
value.g / 255,
value.b / 255
)
})
buildOptionsFolder
.add(material, 'metallic', 0, 1)
.name("Metallic")
buildOptionsFolder
.add(material, 'roughness', 0, 1)
.name("Roughness")
buildOptionsFolder
.add(material, 'emissiveIntensity', 0, 1)
.name("Emissive Intensity")
buildOptionsFolder
.addColor(settings, 'dummy')
.name('Emissive Color')
.onChange((value) => {
material.emissiveColor.set(
value.r / 255,
value.g / 255,
value.b / 255
)
})
buildOptionsFolder.open()