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

games.rednblack.editor.renderer.systems.LightSystem Maven / Gradle / Ivy

package games.rednblack.editor.renderer.systems;

import com.artemis.ComponentMapper;
import com.artemis.annotations.One;
import com.artemis.systems.IteratingSystem;
import com.badlogic.gdx.math.Vector2;
import games.rednblack.editor.renderer.box2dLight.ConeLight;
import games.rednblack.editor.renderer.box2dLight.Light;
import games.rednblack.editor.renderer.box2dLight.RayHandler;
import games.rednblack.editor.renderer.components.ParentNodeComponent;
import games.rednblack.editor.renderer.components.shape.PolygonShapeComponent;
import games.rednblack.editor.renderer.components.TransformComponent;
import games.rednblack.editor.renderer.components.light.LightBodyComponent;
import games.rednblack.editor.renderer.components.light.LightObjectComponent;
import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent;
import games.rednblack.editor.renderer.utils.TransformMathUtils;

@One({LightObjectComponent.class, LightBodyComponent.class})
public class LightSystem extends IteratingSystem {
    protected ComponentMapper lightObjectComponentMapper;
    protected ComponentMapper transformComponentMapper;
    protected ComponentMapper parentNodeComponentMapper;
    protected ComponentMapper lightBodyComponentMapper;
    protected ComponentMapper polygonComponentMapper;
    protected ComponentMapper physicsBodyComponentMapper;

    private RayHandler rayHandler;

    private final Vector2 localCoord = new Vector2();

    @Override
    protected void process(int entity) {
        if (lightBodyComponentMapper.get(entity) != null) {
            processLightBody(entity);
            return;
        }

        LightObjectComponent lightObjectComponent = lightObjectComponentMapper.get(entity);
        lightObjectComponent.setRayHandler(rayHandler);

        Light light = lightObjectComponent.lightObject;
        if (light == null) {
            lightObjectComponent.scheduleRefresh();
        }

        if (light != null && light.getRayNum() != lightObjectComponent.rays) {
            lightObjectComponent.scheduleRefresh();
        }

        lightObjectComponent.executeRefresh(entity);
        light = lightObjectComponent.lightObject;

        TransformMathUtils.localToSceneCoordinates(entity, localCoord.set(0, 0), transformComponentMapper, parentNodeComponentMapper);
        ParentNodeComponent parentNodeComponent = parentNodeComponentMapper.get(entity);

        TransformComponent transform = transformComponentMapper.get(entity);
        float relativeRotation = transform.rotation;

        int parentEntity = parentNodeComponent.parentEntity;
        TransformComponent parentTransformComponent;

        while (parentEntity != -1) {
            parentTransformComponent = transformComponentMapper.get(parentEntity);
            relativeRotation += parentTransformComponent.rotation;
            parentNodeComponent = parentNodeComponentMapper.get(parentEntity);
            if (parentNodeComponent == null) {
                break;
            }
            parentEntity = parentNodeComponent.parentEntity;
        }

        light.setPosition(localCoord.x, localCoord.y);
        light.setSoftnessLength(lightObjectComponent.softnessLength);
        light.setActive(lightObjectComponent.isActive);
        light.setSoft(lightObjectComponent.isSoft);
        light.setHeight(lightObjectComponent.height);
        light.setIntensity(lightObjectComponent.intensity);
        light.setFalloff(lightObjectComponent.falloff);

        if (lightObjectComponent.type == LightObjectComponent.LightType.POINT) {
            lightObjectComponent.lightObject.setDistance(lightObjectComponent.distance);
            lightObjectComponent.lightObject.setStaticLight(lightObjectComponent.isStatic);
            lightObjectComponent.lightObject.setXray(lightObjectComponent.isXRay);
        } else {
            lightObjectComponent.lightObject.setDistance(lightObjectComponent.distance);
            lightObjectComponent.lightObject.setStaticLight(lightObjectComponent.isStatic);
            lightObjectComponent.lightObject.setDirection(lightObjectComponent.directionDegree + relativeRotation);
            ((ConeLight) lightObjectComponent.lightObject).setConeDegree(lightObjectComponent.coneDegree);
            lightObjectComponent.lightObject.setXray(lightObjectComponent.isXRay);
        }
    }

    private void processLightBody(int entityId) {
        LightBodyComponent lightBodyComponent = lightBodyComponentMapper.get(entityId);
        PolygonShapeComponent polygonShapeComponent = polygonComponentMapper.get(entityId);
        PhysicsBodyComponent physicsComponent = physicsBodyComponentMapper.get(entityId);

        lightBodyComponent.setRayHandler(rayHandler);

        if ((polygonShapeComponent == null || physicsComponent == null) && lightBodyComponent.lightObject != null) {
            lightBodyComponent.lightObject.remove();
            lightBodyComponent.lightObject = null;
            return;
        }

        if (lightBodyComponent.lightObject == null && polygonShapeComponent != null && physicsComponent != null) {
            lightBodyComponent.scheduleRefresh();
        }

        if (lightBodyComponent.lightObject != null &&
                (lightBodyComponent.lightObject.getRayNum() != lightBodyComponent.rays)) {
            lightBodyComponent.scheduleRefresh();
        }

        lightBodyComponent.executeRefresh(entityId);

        if (lightBodyComponent.lightObject != null) {
            lightBodyComponent.lightObject.setSoftnessLength(lightBodyComponent.softnessLength);
            lightBodyComponent.lightObject.setHeight(lightBodyComponent.height);
            lightBodyComponent.lightObject.setFalloff(lightBodyComponent.falloff);
            lightBodyComponent.lightObject.setIntensity(lightBodyComponent.intensity);
            lightBodyComponent.lightObject.setDistance(lightBodyComponent.distance);
            lightBodyComponent.lightObject.setActive(lightBodyComponent.isActive);
            lightBodyComponent.lightObject.setSoft(lightBodyComponent.isSoft);
            lightBodyComponent.lightObject.setStaticLight(false);//TODO Figure out why static lights does not change position
            lightBodyComponent.lightObject.setXray(lightBodyComponent.isXRay);
            lightBodyComponent.lightObject.setColor(lightBodyComponent.color[0], lightBodyComponent.color[1], lightBodyComponent.color[2], lightBodyComponent.color[3]);
            lightBodyComponent.lightObject.update();
        }
    }

    public void setRayHandler(RayHandler rayHandler) {
        this.rayHandler = rayHandler;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy