
org.oscim.renderer.GLViewport Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vtm Show documentation
Show all versions of vtm Show documentation
OpenGL vector map library written in Java - running on Android, iOS, Desktop and within the browser.
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016 Andrey Novikov
* Copyright 2016 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see .
*/
package org.oscim.renderer;
import org.oscim.core.MapPosition;
import org.oscim.map.Map;
import org.oscim.map.Viewport;
public class GLViewport extends Viewport {
public enum Position {
TOP_LEFT, TOP_CENTER, TOP_RIGHT, CENTER_LEFT, CENTER, CENTER_RIGHT, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT
}
/**
* Do not modify!
*/
public final GLMatrix viewproj = mViewProjMatrix;
/**
* Do not modify!
*/
public final GLMatrix proj = mProjMatrix;
/**
* Do not modify!
*/
public final GLMatrix view = mViewMatrix;
/**
* Do not modify!
*/
public final float[] plane = new float[8];
/**
* For temporary use, to setup MVP-Matrix
*/
public final GLMatrix mvp = new GLMatrix();
public final MapPosition pos = mPos;
/**
* Set MVP so that coordinates are in screen pixel coordinates with 0,0
* being center
*/
public void useScreenCoordinates(boolean center, float scale) {
float invScale = 1f / scale;
if (center)
mvp.setScale(invScale, invScale, invScale);
else
mvp.setTransScale(-mWidth / 2, -mHeight / 2, invScale);
mvp.multiplyLhs(proj);
}
/**
* Set MVP so that coordinates are in screen pixel coordinates with 0,0
* being center
*/
public void useScreenCoordinates(int width, int height, Position position, float xOffset, float yOffset, float scale) {
float invScale = 1f / scale;
float x = 0;
float y = 0;
switch (position) {
case TOP_LEFT:
x = -mWidth * 0.5f + xOffset;
y = -mHeight * 0.5f + yOffset;
break;
case TOP_CENTER:
x = -width * 0.5f + xOffset;
y = -mHeight * 0.5f + yOffset;
break;
case TOP_RIGHT:
x = mWidth * 0.5f - width - xOffset;
y = -mHeight * 0.5f + yOffset;
break;
case CENTER_LEFT:
x = -mWidth * 0.5f + xOffset;
y = -height * 0.5f + yOffset;
break;
case CENTER:
x = -width * 0.5f + xOffset;
y = -height * 0.5f + yOffset;
break;
case CENTER_RIGHT:
x = mWidth * 0.5f - width - xOffset;
y = -height * 0.5f + yOffset;
break;
case BOTTOM_LEFT:
x = -mWidth * 0.5f + xOffset;
y = mHeight * 0.5f - height - yOffset;
break;
case BOTTOM_CENTER:
x = -width * 0.5f + xOffset;
y = mHeight * 0.5f - height - yOffset;
break;
case BOTTOM_RIGHT:
x = mWidth * 0.5f - width - xOffset;
y = mHeight * 0.5f - height - yOffset;
break;
}
mvp.setTransScale(x, y, invScale);
mvp.multiplyLhs(proj);
}
protected boolean changed;
public boolean changed() {
return changed;
}
void setFrom(Map map) {
changed = map.viewport().getSyncViewport(this);
getMapExtents(plane, 0);
}
/**
* @return width in pixels
*/
public float getWidth() {
return mWidth;
}
/**
* @return height in pixels
*/
public float getHeight() {
return mHeight;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy