Home Reference Source

src/helpers/normal.js

import { vec3 } from 'gl-matrix';
import Model from '../core/model';
import Basic from '../material/basic';
import { GL_LINES } from '../session';

class NormalHelper extends Model {
    constructor(props) {
        const geometry = {
            positions: [],
            indices: [],
        };

        // extract geometry
        const sx = props.model.scale.x;
        const sy = props.model.scale.y;
        const sz = props.model.scale.z;

        const length = props.model.geometry.normals.length / 3;
        for (let i = 0; i < length; i++) {
            const i3 = i * 3;
            const v0x = sx * props.model.geometry.positions[i3 + 0];
            const v0y = sy * props.model.geometry.positions[i3 + 1];
            const v0z = sz * props.model.geometry.positions[i3 + 2];
            const nx = props.model.geometry.normals[i3 + 0];
            const ny = props.model.geometry.normals[i3 + 1];
            const nz = props.model.geometry.normals[i3 + 2];
            const v1x = v0x + (props.size * nx);
            const v1y = v0y + (props.size * ny);
            const v1z = v0z + (props.size * nz);
            geometry.positions = geometry.positions.concat([v0x, v0y, v0z, v1x, v1y, v1z]);
        }

        const material = new Basic({ color: (props && props.color) || 0xffffff });
        super(geometry, material);
        this.reference = props.model;
        this.material.glMode = GL_LINES;
    }

    update() {
        super.update();

        vec3.copy(this.position.data, this.reference.position.data);
        vec3.copy(this.rotation.data, this.reference.rotation.data);
        this.lookToTarget = this.reference.lookToTarget;
    }
}

export default NormalHelper;