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

com.gempukku.libgdx.graph.pipeline.producer.node.OncePerFrameMultipleInputsJobPipelineNode Maven / Gradle / Ivy

package com.gempukku.libgdx.graph.pipeline.producer.node;

import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.gempukku.libgdx.graph.data.NodeConfiguration;
import com.gempukku.libgdx.graph.pipeline.PipelineFieldType;
import com.gempukku.libgdx.graph.pipeline.producer.PipelineRenderingContext;

public abstract class OncePerFrameMultipleInputsJobPipelineNode implements PipelineNode {
    private boolean executedInFrame;
    private NodeConfiguration configuration;
    private ObjectMap>> inputFields;
    private ObjectMap> workerFieldOutputs = new ObjectMap<>();

    public OncePerFrameMultipleInputsJobPipelineNode(NodeConfiguration configuration, ObjectMap>> inputFields) {
        this.configuration = configuration;
        this.inputFields = inputFields;
    }

    @Override
    public void initializePipeline(PipelineInitializationFeedback pipelineInitializationFeedback) {

    }

    @Override
    public FieldOutput getFieldOutput(String name) {
        WorkerFieldOutput fieldOutput = workerFieldOutputs.get(name);
        if (fieldOutput == null) {
            PipelineFieldType fieldType = determineOutputType(name, inputFields);
            fieldOutput = new WorkerFieldOutput<>(fieldType);
            workerFieldOutputs.put(name, fieldOutput);
        }

        return fieldOutput;
    }

    private PipelineFieldType determineOutputType(String name, ObjectMap>> inputFields) {
        ObjectMap> inputs = new ObjectMap<>();
        for (String field : inputFields.keys()) {
            Array types = new Array<>();
            for (FieldOutput fieldOutput : inputFields.get(field)) {
                types.add(fieldOutput.getPropertyType());
            }
            inputs.put(field, types);
        }

        return configuration.getNodeOutputs().get(name).determineFieldType(inputs);
    }

    protected abstract void executeJob(PipelineRenderingContext pipelineRenderingContext, ObjectMap outputValues);

    @Override
    public void startFrame() {

    }

    @Override
    public void endFrame() {
        executedInFrame = false;
    }

    @Override
    public void dispose() {

    }

    private class WorkerFieldOutput implements FieldOutput, OutputValue {
        private PipelineFieldType fieldType;
        private T value;

        public WorkerFieldOutput(PipelineFieldType fieldType) {
            this.fieldType = fieldType;
        }

        @Override
        public void setValue(T value) {
            this.value = value;
        }

        @Override
        public PipelineFieldType getPropertyType() {
            return fieldType;
        }

        @Override
        public T getValue(PipelineRenderingContext context, PipelineRequirements pipelineRequirements) {
            if (!executedInFrame) {
                executeJob(context, workerFieldOutputs);
            }
            return value;
        }
    }

    protected interface OutputValue {
        void setValue(T value);
    }
}