/* * Copyright 2013 MovingBlocks * * 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 org.terasology.input.cameraTarget; import java.util.Arrays; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.logic.location.LocationComponent; import org.terasology.math.geom.Vector3f; import org.terasology.math.geom.Vector3i; import org.terasology.physics.CollisionGroup; import org.terasology.physics.HitResult; import org.terasology.physics.Physics; import org.terasology.physics.StandardCollisionGroup; import org.terasology.world.BlockEntityRegistry; public class TargetSystem { private final BlockEntityRegistry blockRegistry; private final Physics physics; private EntityRef target = EntityRef.NULL; private EntityRef prevTarget = EntityRef.NULL; private Vector3i targetBlockPos; private CollisionGroup[] filter = {StandardCollisionGroup.DEFAULT, StandardCollisionGroup.WORLD}; public TargetSystem(BlockEntityRegistry blockRegistry, Physics physics) { this.blockRegistry = blockRegistry; this.physics = physics; } public boolean isTargetAvailable() { return target.exists() || targetBlockPos != null; } public EntityRef getPreviousTarget() { return prevTarget; } public EntityRef getTarget() { return target; } public void setFilter(CollisionGroup... filter) { this.filter = Arrays.copyOf(filter, filter.length); } public boolean updateTarget(Vector3f pos, Vector3f dir, float maxDist) { if (targetBlockPos != null && !target.exists()) { target = blockRegistry.getEntityAt(targetBlockPos); } HitResult hitInfo = physics.rayTrace(pos, dir, maxDist, filter); EntityRef newTarget = hitInfo.getEntity(); if (hitInfo.isWorldHit()) { if (targetBlockPos != null) { if (targetBlockPos.equals(hitInfo.getBlockPosition())) { return false; } } targetBlockPos = hitInfo.getBlockPosition(); } else { if (target.equals(newTarget)) { return false; } targetBlockPos = null; } prevTarget = target; target = newTarget; LocationComponent location = target.getComponent(LocationComponent.class); if (location != null && targetBlockPos != null) { location.setLocalPosition(targetBlockPos.toVector3f()); } return true; } }