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

com.talosvfx.talos.runtime.render.drawables.PolylineRenderer Maven / Gradle / Ivy

There is a newer version: 1.4.1
Show newest version
/*******************************************************************************
 * 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.render.drawables;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.TimeUtils;
import com.talosvfx.talos.runtime.Particle;
import com.talosvfx.talos.runtime.ParticleDrawable;

public class PolylineRenderer implements ParticleDrawable {

    float seed;
    int interpolationPointCount;

    public Pool polylinePool = new Pool() {
        @Override
        protected Polyline newObject() {
            return new Polyline();
        }
    };
    private TextureRegion region;

    ObjectMap polylineMap = new ObjectMap<>();
    ObjectMap cacheExpire = new ObjectMap<>();
    Array tmpArr = new Array<>();

    @Override
    public void draw(Batch batch, float x, float y, float width, float height, float rotation) {
        Polyline polyline = polyline();
        polyline.set(width, rotation);
        polyline.draw(batch, region, x, y);

        // remove items from cache
        long timeNow = TimeUtils.millis();
        tmpArr.clear();
        for(Float seed: cacheExpire.keys()) {
            if(timeNow - cacheExpire.get(seed) > 200f) {
                tmpArr.add(seed);
            }
        }
        for(int i = 0; i < tmpArr.size; i++) {
            cacheExpire.remove(tmpArr.get(i));
            if(polylineMap.containsKey(tmpArr.get(i))) {
                polylinePool.free(polylineMap.get(tmpArr.get(i)));
            }
            polylineMap.remove(tmpArr.get(i));
        }
    }

    @Override
    public void draw (Batch batch, Particle particle, Color color) {
        float rotation = particle.rotation;
        float width = particle.size.x;
        float height = particle.size.y;
        float y = particle.getY();
        float x = particle.getX();

        draw(batch, x, y, width, height, rotation);
    }

    @Override
    public float getAspectRatio() {
        return 1f;
    }

    @Override
    public void setSeed(float seed) {
        this.seed = seed;
    }

    @Override
    public TextureRegion getTextureRegion() {
        return region;
    }

    public void setRegion(TextureRegion region) {
        this.region = region;
    }

    public void setCount(int count) {
        interpolationPointCount = count;
        // reset all existing items from the pool
        polylinePool.freeAll(polylineMap.values().toArray());
        polylineMap.clear();
    }

    public void setPointData(int pointIndex, float offsetX, float offsetY, float thickness, Color color) {
        Polyline polyline = polyline();
        polyline.setPointData(pointIndex, offsetX, offsetY, thickness, color);
    }

    private Polyline polyline() {
        if(polylineMap.get(seed) == null) {
            Polyline polyline = polylinePool.obtain();
            polyline.initPoints(interpolationPointCount);
            polylineMap.put(seed, polyline);
        }

        cacheExpire.put(seed, TimeUtils.millis());

        return polylineMap.get(seed);
    }

    public void setTangents(float leftX, float leftY, float rightX, float rightY) {
        Polyline polyline = polyline();
        polyline.leftTangent.set(leftX, leftY);
        polyline.rightTanget.set(rightX, rightY);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy