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

com.gempukku.libgdx.graph.pipeline.producer.math.arithmetic.AddPipelineNodeProducer Maven / Gradle / Ivy

package com.gempukku.libgdx.graph.pipeline.producer.math.arithmetic;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.utils.ObjectMap;
import com.gempukku.libgdx.graph.pipeline.PipelineFieldType;
import com.gempukku.libgdx.graph.pipeline.config.math.arithmetic.AddPipelineNodeConfiguration;
import com.gempukku.libgdx.graph.pipeline.producer.PipelineRenderingContext;
import com.gempukku.libgdx.graph.pipeline.producer.node.OncePerFrameMultipleInputsJobPipelineNode;
import com.gempukku.libgdx.graph.pipeline.producer.node.PipelineNode;
import com.gempukku.libgdx.graph.pipeline.producer.node.PipelineNodeProducerImpl;

public class AddPipelineNodeProducer extends PipelineNodeProducerImpl {
    public AddPipelineNodeProducer() {
        super(new AddPipelineNodeConfiguration());
    }

    @Override
    protected PipelineNode createNodeForSingleInputs(JsonValue data, ObjectMap> inputFields) {
        return null;
    }

    @Override
    public PipelineNode createNode(JsonValue data, ObjectMap>> inputFields) {
        final Array> inputs = inputFields.get("inputs");
        final PipelineFieldType resultType = determineOutputType(inputs);

        final Object result = createDefaultValue(resultType);

        return new OncePerFrameMultipleInputsJobPipelineNode(configuration, inputFields) {
            @Override
            protected void executeJob(PipelineRenderingContext pipelineRenderingContext, ObjectMap outputValues) {
                Object returnValue = resetDefaultValue(resultType, result);
                for (FieldOutput input : inputs) {
                    Object value = input.getValue(pipelineRenderingContext, null);
                    returnValue = add(returnValue, value);
                }

                OutputValue output = outputValues.get("output");
                if (output != null)
                    output.setValue(returnValue);
            }
        };
    }

    private Object add(Object obj, Object value) {
        if (value instanceof Float) {
            float f = (float) value;
            if (obj instanceof Float)
                return (float) obj + f;
            if (obj instanceof Color) {
                return ((Color) obj).add(f, f, f, f);
            }
            if (obj instanceof Vector2) {
                return ((Vector2) obj).add(f, f);
            }
            if (obj instanceof Vector3) {
                return ((Vector3) obj).add(f);
            }
        } else {
            if (obj instanceof Color)
                return ((Color) obj).add((Color) value);
            if (obj instanceof Vector2)
                return ((Vector2) obj).add((Vector2) value);
            if (obj instanceof Vector3)
                return ((Vector3) obj).add((Vector3) value);
        }
        return null;
    }

    private Object createDefaultValue(PipelineFieldType type) {
        if (type == PipelineFieldType.Float)
            return 0f;
        else if (type == PipelineFieldType.Vector2)
            return new Vector2();
        else if (type == PipelineFieldType.Vector3)
            return new Vector3();
        else
            return new Color(0, 0, 0, 0);
    }

    private Object resetDefaultValue(PipelineFieldType type, Object value) {
        if (type == PipelineFieldType.Float)
            return 0f;
        else if (type == PipelineFieldType.Vector2)
            return ((Vector2) value).set(0f, 0f);
        else if (type == PipelineFieldType.Vector3)
            return ((Vector3) value).set(0f, 0f, 0f);
        else
            return ((Color) value).set(0f, 0f, 0f, 0f);
    }

    private PipelineFieldType determineOutputType(Array> inputs) {
        PipelineFieldType result = PipelineFieldType.Float;
        for (PipelineNode.FieldOutput input : inputs) {
            PipelineFieldType fieldType = input.getPropertyType();
            if (fieldType != result && (result != PipelineFieldType.Float && fieldType != PipelineFieldType.Float))
                throw new IllegalStateException("Invalid mix of input field types");
            if (fieldType != PipelineFieldType.Float)
                result = fieldType;
        }
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy