/* * Copyright (C) 2012- Peer internet solutions & Finalist IT Group * * This file is part of mixare. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/> */ package org.mixare.lib.marker; import java.net.URLDecoder; import org.mixare.lib.gui.Label; import org.mixare.lib.gui.TextObj; import org.mixare.lib.marker.draw.ClickHandler; import org.mixare.lib.marker.draw.DrawCommand; import org.mixare.lib.marker.draw.ParcelableProperty; import org.mixare.lib.marker.draw.PrimitiveProperty; import org.mixare.lib.reality.PhysicalPlace; import org.mixare.lib.render.Camera; import org.mixare.lib.render.MixVector; import android.location.Location; /** * A plugin marker that should be extended by marker plugins. * @author A. Egal * */ public abstract class PluginMarker{ private String ID; protected String title; protected boolean underline = false; private String URL; protected PhysicalPlace mGeoLoc; // distance from user to mGeoLoc in meters protected double distance; // The marker color private int colour; private boolean active; // Draw properties protected boolean isVisible; public MixVector cMarker = new MixVector(); protected MixVector signMarker = new MixVector(); protected MixVector locationVector = new MixVector(); private MixVector origin = new MixVector(0, 0, 0); private MixVector upV = new MixVector(0, 1, 0); public Label txtLab = new Label(); protected TextObj textBlock; public PluginMarker(int id, String title, double latitude, double longitude, double altitude, String link, int type, int colour) { super(); this.active = true; this.title = title; this.mGeoLoc = new PhysicalPlace(latitude,longitude,altitude); if (link != null && link.length() > 0) { URL = "webpage:" + URLDecoder.decode(link); this.underline = true; } this.colour = colour; this.ID= id + "##"+ type +"##"+title; } public String getURL() { return URL; } public double getLatitude() { return mGeoLoc.getLatitude(); } public double getLongitude() { return mGeoLoc.getLongitude(); } public double getAltitude() { return mGeoLoc.getAltitude(); } public MixVector getLocationVector() { return locationVector; } public double getDistance() { return distance; } public void setDistance(double distance) { this.distance = distance; } public String getID() { return ID; } public void setID(String iD) { this.ID = iD; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } public int getColour() { return colour; } public boolean isVisible() { return isVisible; } public ClickHandler fClick() { return new ClickHandler(URL, active, txtLab, signMarker, cMarker); } public abstract int getMaxObjects(); public MixVector getCMarker() { return cMarker; } public MixVector getSignMarker() { return signMarker; } public boolean getUnderline() { return underline; } public String getTitle() { return title; } public abstract DrawCommand[] remoteDraw(); public void update(Location curGPSFix) { // An elevation of 0.0 probably means that the elevation of the // POI is not known and should be set to the users GPS height // Note: this could be improved with calls to // http://www.geonames.org/export/web-services.html#astergdem // to estimate the correct height with DEM models like SRTM, AGDEM or // GTOPO30 if (mGeoLoc.getAltitude() == 0.0) mGeoLoc.setAltitude(curGPSFix.getAltitude()); // compute the relative position vector from user position to POI // location PhysicalPlace.convLocToVec(curGPSFix, mGeoLoc, locationVector); } public void calcPaint(Camera viewCam, float addX, float addY) { cCMarker(origin, viewCam, addX, addY); calcV(viewCam); } private void cCMarker(MixVector originalPoint, Camera viewCam, float addX, float addY) { // Temp properties MixVector tmpa = new MixVector(originalPoint); MixVector tmpc = new MixVector(upV); tmpa.add(locationVector); //3 tmpc.add(locationVector); //3 tmpa.sub(viewCam.lco); //4 tmpc.sub(viewCam.lco); //4 tmpa.prod(viewCam.transform); //5 tmpc.prod(viewCam.transform); //5 MixVector tmpb = new MixVector(); viewCam.projectPoint(tmpa, tmpb, addX, addY); //6 cMarker.set(tmpb); //7 viewCam.projectPoint(tmpc, tmpb, addX, addY); //6 signMarker.set(tmpb); //7 } private void calcV(Camera viewCam) { isVisible = true; if (cMarker.z < -1f) { isVisible = true; //if (MixUtils.pointInside(cMarker.x, cMarker.y, 0, 0, // viewCam.width, viewCam.height)) { //} } } public void setTxtLab(Label txtLab) { this.txtLab = txtLab; } public Label getTxtLab() { return txtLab; } public void setExtras(String name, ParcelableProperty parcelableProperty){ //can be overriden } public void setExtras(String name, PrimitiveProperty primitiveProperty){ //can be overriden } }