All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.talosvfx.talos.runtime.values.NumericalValue Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright 2019 See AUTHORS file.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.talosvfx.talos.runtime.values;

import com.badlogic.gdx.math.MathUtils;

import java.util.Arrays;

public class NumericalValue extends Value {

	private float[] elements = new float[4];

	private int currentElementCount;

	public enum Flavour {
		REGULAR,
		ANGLE,
		NORMALIZED
	}

	private Flavour flavour = Flavour.REGULAR;

	public void setFlavour(Flavour flavour) {
		this.flavour = flavour;
	}

	public Flavour getFlavour() {
		return flavour;
	}

	public void configure (int elementCount) {
		//Depeneding on the values

		//If we are 2 element count vector, and other is a 3 vector, we increase currentElementCount and init with 0
		currentElementCount = elementCount;

	}

	public void sum (NumericalValue other, NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = elements[i] + other.elements[i];
		}
		out.setElementsCount(elementsCount());
	}

	public void sub (NumericalValue other, NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = elements[i] - other.elements[i];
		}
		out.setElementsCount(elementsCount());
	}

	public void mul (float val, NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = elements[i] * val;
		}
		out.setElementsCount(elementsCount());
	}

	public void div (NumericalValue other, NumericalValue out) {


		for (int i = 0; i < currentElementCount; i++) {
			float d = other.getFloat();
			if(d==0)d=1;
			out.elements[i] = elements[i] / d;
		}
		out.setElementsCount(elementsCount());
	}

	public void mul (NumericalValue other, NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = elements[i] * other.elements[i];
		}
		out.setElementsCount(elementsCount());
	}

	public void sin (NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = MathUtils.sinDeg(elements[i]);
		}
		out.setElementsCount(elementsCount());
	}

	public void cos (NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = MathUtils.cosDeg(elements[i]);
		}
		out.setElementsCount(elementsCount());
	}


	@Override
	public void set(Value value) {
		set((NumericalValue) value);
	}

	public void set (NumericalValue other) {
		if(other.elementsCount() > currentElementCount) {
			currentElementCount = other.elementsCount();
		}
		for (int i = 0; i < 4; i++) {
			if (i < currentElementCount) {
				elements[i] = other.elements[i];
			} else {
				elements[i] = 0;
			}
		}
	}

	public void set(int index, float value) {
		elements[index] = value;
	}

	public void set(float value) {
		currentElementCount = 1;
		elements[0] = value;
	}

	public void set(float val1, float val2) {
		currentElementCount = 2;
		elements[0] = val1;
		elements[1] = val2;
	}

	public void set(NumericalValue val1, NumericalValue val2) {
		currentElementCount = 2;
		elements[0] = val1.getFloat();
		elements[1] = val2.getFloat();
	}

	public void set(NumericalValue val1, NumericalValue val2, NumericalValue val3) {
		currentElementCount = 3;
		elements[0] = val1.getFloat();
		elements[1] = val2.getFloat();
		elements[2] = val3.getFloat();
	}

	public void set(float val1, float val2, float val3) {
		currentElementCount = 3;
		elements[0] = val1;
		elements[1] = val2;
		elements[2] = val3;
	}

	public void set(float val1, float val2, float val3, float val4) {
		currentElementCount = 4;
		elements[0] = val1;
		elements[1] = val2;
		elements[2] = val3;
		elements[3] = val3;
	}

	public float getFloat() {
		return elements[0];
	}

	public int elementsCount() {
		return currentElementCount;
	}

	public void setElementsCount(int elementsCount) {
		currentElementCount = elementsCount;
	}

	public float[] getElements() {
		return elements;
	}

	public float get(int index) {
		return elements[index];
	}

	public void pow(NumericalValue b, NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = (float) Math.pow(elements[i], b.getFloat());
		}
		out.setElementsCount(elementsCount());
	}

	public void abs(NumericalValue out) {
		for (int i = 0; i < currentElementCount; i++) {
			out.elements[i] = Math.abs(elements[i]);
		}
		out.setElementsCount(elementsCount());
	}

	@Override
	public String toString () {
		return Arrays.toString(elements);
	}

	@Override
	public void setEmpty(boolean isEmpty) {
		super.setEmpty(isEmpty);
		if(isEmpty) {
			currentElementCount = 0;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy