|
@@ -1,25 +1,30 @@
|
|
|
import * as React from "react";
|
|
|
import { Observable } from "babylonjs/Misc/observable";
|
|
|
-import { Quaternion } from "babylonjs/Maths/math";
|
|
|
+import { Quaternion, Vector3 } from "babylonjs/Maths/math";
|
|
|
import { NumericInputComponent } from "./numericInputComponent";
|
|
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
|
import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons";
|
|
|
import { PropertyChangedEvent } from "../../propertyChangedEvent";
|
|
|
+import { Tools } from 'babylonjs/Misc/tools';
|
|
|
+import { SliderLineComponent } from './sliderLineComponent';
|
|
|
|
|
|
interface IQuaternionLineComponentProps {
|
|
|
label: string;
|
|
|
target: any;
|
|
|
+ useEuler?: boolean;
|
|
|
propertyName: string;
|
|
|
onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
|
|
|
}
|
|
|
|
|
|
-export class QuaternionLineComponent extends React.Component<IQuaternionLineComponentProps, { isExpanded: boolean, value: Quaternion }> {
|
|
|
+export class QuaternionLineComponent extends React.Component<IQuaternionLineComponentProps, { isExpanded: boolean, value: Quaternion, eulerValue: Vector3 }> {
|
|
|
private _localChange = false;
|
|
|
|
|
|
constructor(props: IQuaternionLineComponentProps) {
|
|
|
super(props);
|
|
|
|
|
|
- this.state = { isExpanded: false, value: this.props.target[this.props.propertyName].clone() }
|
|
|
+ let quat = this.props.target[this.props.propertyName].clone();
|
|
|
+
|
|
|
+ this.state = { isExpanded: false, value: quat, eulerValue: quat.toEulerAngles() }
|
|
|
}
|
|
|
|
|
|
shouldComponentUpdate(nextProps: IQuaternionLineComponentProps, nextState: { isExpanded: boolean, value: Quaternion }) {
|
|
@@ -87,10 +92,42 @@ export class QuaternionLineComponent extends React.Component<IQuaternionLineComp
|
|
|
this.updateQuaternion();
|
|
|
}
|
|
|
|
|
|
+ updateQuaternionFromEuler() {
|
|
|
+ let quat = this.state.eulerValue.toQuaternion();
|
|
|
+ this.state.value.x = quat.x;
|
|
|
+ this.state.value.y = quat.y;
|
|
|
+ this.state.value.z = quat.z;
|
|
|
+ this.state.value.w = quat.w;
|
|
|
+
|
|
|
+ this.updateQuaternion();
|
|
|
+ }
|
|
|
+
|
|
|
+ updateStateEulerX(value: number) {
|
|
|
+ this._localChange = true;
|
|
|
+
|
|
|
+ this.state.eulerValue.x = Tools.ToRadians(value);
|
|
|
+ this.updateQuaternionFromEuler();
|
|
|
+ }
|
|
|
+
|
|
|
+ updateStateEulerY(value: number) {
|
|
|
+ this._localChange = true;
|
|
|
+
|
|
|
+ this.state.eulerValue.y = Tools.ToRadians(value);
|
|
|
+ this.updateQuaternionFromEuler();
|
|
|
+ }
|
|
|
+
|
|
|
+ updateStateEulerZ(value: number) {
|
|
|
+ this._localChange = true;
|
|
|
+
|
|
|
+ this.state.eulerValue.z = Tools.ToRadians(value);
|
|
|
+ this.updateQuaternionFromEuler();
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
const chevron = this.state.isExpanded ? <FontAwesomeIcon icon={faMinus} /> : <FontAwesomeIcon icon={faPlus} />
|
|
|
|
|
|
let quat = this.state.value;
|
|
|
+ let euler = this.state.eulerValue;
|
|
|
|
|
|
return (
|
|
|
<div className="vector3Line">
|
|
@@ -99,14 +136,21 @@ export class QuaternionLineComponent extends React.Component<IQuaternionLineComp
|
|
|
{this.props.label}
|
|
|
</div>
|
|
|
<div className="vector">
|
|
|
- {`X: ${quat.x.toFixed(1)}, Y: ${quat.y.toFixed(1)}, Z: ${quat.z.toFixed(1)}, W: ${quat.w.toFixed(1)}`}
|
|
|
+ {
|
|
|
+ !this.props.useEuler &&
|
|
|
+ `X: ${quat.x.toFixed(1)}, Y: ${quat.y.toFixed(1)}, Z: ${quat.z.toFixed(1)}, W: ${quat.w.toFixed(1)}`
|
|
|
+ }
|
|
|
+ {
|
|
|
+ this.props.useEuler &&
|
|
|
+ `X: ${Tools.ToDegrees(euler.x).toFixed(2)}, Y: ${Tools.ToDegrees(euler.y).toFixed(2)}, Z: ${Tools.ToDegrees(euler.z).toFixed(2)}`
|
|
|
+ }
|
|
|
</div>
|
|
|
<div className="expand" onClick={() => this.switchExpandState()}>
|
|
|
{chevron}
|
|
|
</div>
|
|
|
</div>
|
|
|
{
|
|
|
- this.state.isExpanded &&
|
|
|
+ this.state.isExpanded && !this.props.useEuler &&
|
|
|
<div className="secondLine">
|
|
|
<NumericInputComponent label="x" value={quat.x} onChange={value => this.updateStateX(value)} />
|
|
|
<NumericInputComponent label="y" value={quat.y} onChange={value => this.updateStateY(value)} />
|
|
@@ -114,6 +158,14 @@ export class QuaternionLineComponent extends React.Component<IQuaternionLineComp
|
|
|
<NumericInputComponent label="w" value={quat.w} onChange={value => this.updateStateW(value)} />
|
|
|
</div>
|
|
|
}
|
|
|
+ {
|
|
|
+ this.state.isExpanded && this.props.useEuler &&
|
|
|
+ <div className="secondLine">
|
|
|
+ <SliderLineComponent label="x" minimum={0} maximum={360} step={0.1} directValue={Tools.ToDegrees(euler.x)} onChange={value => this.updateStateEulerX(value)} />
|
|
|
+ <SliderLineComponent label="y" minimum={0} maximum={360} step={0.1} directValue={Tools.ToDegrees(euler.y)} onChange={value => this.updateStateEulerY(value)} />
|
|
|
+ <SliderLineComponent label="z" minimum={0} maximum={360} step={0.1} directValue={Tools.ToDegrees(euler.z)} onChange={value => this.updateStateEulerZ(value)} />
|
|
|
+ </div>
|
|
|
+ }
|
|
|
</div>
|
|
|
);
|
|
|
}
|