Skip to content

CustomGeometry


WebGPU is not supported in your browser
Please upgrade to latest Chrome/Edge

ts
import { Engine3D, View3D, Scene3D, CameraUtil, AtmosphericComponent, webGPUContext, HoverCameraController, Object3D, DirectLight, KelvinUtil, PlaneGeometry, VertexAttributeName, LitMaterial, MeshRenderer } from '@orillusion/core'
import { Stats } from '@orillusion/stats'

// An sample of custom vertex attribute of geometry
class Sample_CustomGeometry {
    dirLight: DirectLight
    async run() {
        Engine3D.setting.shadow.autoUpdate = true

        await Engine3D.init()
        let view = new View3D()
        view.scene = new Scene3D()
        let sky = view.scene.addComponent(AtmosphericComponent)

        view.camera = CameraUtil.createCamera3DObject(view.scene)
        view.camera.perspective(60, webGPUContext.aspect, 1, 5000.0)
        view.camera.object3D.z = -15
        view.camera.object3D.addComponent(HoverCameraController).setCamera(35, -20, 150)

        Engine3D.startRenderView(view)

        await this.createScene(view.scene)
        sky.relativeTransform = this.dirLight.transform
    }

    private async createScene(scene: Scene3D) {
        let sunObj = new Object3D()
        let sunLight = (this.dirLight = sunObj.addComponent(DirectLight))
        sunLight.lightColor = KelvinUtil.color_temperature_to_rgb(65533)
        sunLight.castShadow = true
        sunObj.transform.rotationX = 50
        sunObj.transform.rotationY = 50
        scene.addChild(sunObj)

        // define a plane geometry
        let geometry = new PlaneGeometry(100, 100, 80, 80)
        let attribute = geometry.getAttribute(VertexAttributeName.position)

        // add a plane into scene
        let plane = new Object3D()
        let meshRenderer = plane.addComponent(MeshRenderer)
        meshRenderer.geometry = geometry
        meshRenderer.material = new LitMaterial()

        // set y-axis to a random number
        let count = attribute.data.length / 3
        for (let i = 0; i < count; i++) {
            attribute.data[i * 3 + 0]
            attribute.data[i * 3 + 1] = Math.random() * 20 - 10
            attribute.data[i * 3 + 2]
        }

        geometry.vertexBuffer.upload(VertexAttributeName.position, attribute)
        geometry.computeNormals()
        scene.addChild(plane)
        scene.addComponent(Stats)
    }
}

new Sample_CustomGeometry().run()