Support TextureRegion to be used for MarkerSymbol (#245)

This commit is contained in:
Schedul Xor 2016-11-21 17:49:04 +09:00 committed by Emux
parent 0c39ff8be0
commit 41867344e2
2 changed files with 78 additions and 3 deletions

View File

@ -1,5 +1,6 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016 Izumi Kawashima
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@ -161,7 +162,11 @@ public class MarkerRenderer extends BucketRenderer {
marker = mDefaultMarker;
SymbolItem s = SymbolItem.pool.get();
s.set(it.x, it.y, marker.getBitmap(), true);
if (marker.isBitmap()) {
s.set(it.x, it.y, marker.getBitmap(), true);
} else {
s.set(it.x, it.y, marker.getTextureRegion(), true);
}
s.offset = marker.getHotspot();
s.billboard = marker.isBillboard();
mSymbolLayer.pushSymbol(s);

View File

@ -1,6 +1,7 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86
* Copyright 2016 Izumi Kawashima
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
@ -19,6 +20,7 @@ package org.oscim.layers.marker;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.PointF;
import org.oscim.renderer.atlas.TextureRegion;
public class MarkerSymbol {
/**
@ -34,12 +36,64 @@ public class MarkerSymbol {
}
final Bitmap mBitmap;
final TextureRegion mTextureRegion;
/**
* Hotspot offset
*/
final PointF mOffset;
final boolean mBillboard;
public MarkerSymbol(TextureRegion textureRegion, float relX, float relY) {
this(textureRegion, relX, relY, true);
}
public MarkerSymbol(TextureRegion textureRegion, float relX, float relY, boolean billboard) {
mBitmap = null;
mTextureRegion = textureRegion;
mOffset = new PointF(relX, relY);
mBillboard = billboard;
}
public MarkerSymbol(TextureRegion textureRegion, HotspotPlace hotspot) {
this(textureRegion, hotspot, true);
}
public MarkerSymbol(TextureRegion textureRegion, HotspotPlace hotspot, boolean billboard) {
mBitmap = null;
mTextureRegion = textureRegion;
switch (hotspot) {
case BOTTOM_CENTER:
mOffset = new PointF(0.5f, 1);
break;
case TOP_CENTER:
mOffset = new PointF(0.5f, 0);
break;
case RIGHT_CENTER:
mOffset = new PointF(1, 0.5f);
break;
case LEFT_CENTER:
mOffset = new PointF(0, 0.5f);
break;
case UPPER_RIGHT_CORNER:
mOffset = new PointF(1, 0);
break;
case LOWER_RIGHT_CORNER:
mOffset = new PointF(1, 1);
break;
case UPPER_LEFT_CORNER:
mOffset = new PointF(0, 0);
break;
case LOWER_LEFT_CORNER:
mOffset = new PointF(0, 1);
break;
default:
mOffset = new PointF(0.5f, 0.5f);
}
mBillboard = billboard;
}
public MarkerSymbol(Bitmap bitmap, float relX, float relY) {
this(bitmap, relX, relY, true);
}
@ -48,6 +102,7 @@ public class MarkerSymbol {
mBitmap = bitmap;
mOffset = new PointF(relX, relY);
mBillboard = billboard;
mTextureRegion = null;
}
public MarkerSymbol(Bitmap bitmap, HotspotPlace hotspot) {
@ -87,6 +142,7 @@ public class MarkerSymbol {
mBitmap = bitmap;
mBillboard = billboard;
mTextureRegion = null;
}
public boolean isBillboard() {
@ -97,14 +153,28 @@ public class MarkerSymbol {
return mOffset;
}
public boolean isBitmap() {
return mBitmap != null;
}
public Bitmap getBitmap() {
return mBitmap;
}
public TextureRegion getTextureRegion() {
return mTextureRegion;
}
public boolean isInside(float dx, float dy) {
/* TODO handle no-billboard */
int w = mBitmap.getWidth();
int h = mBitmap.getHeight();
int w, h;
if (isBitmap()) {
w = mBitmap.getWidth();
h = mBitmap.getHeight();
} else {
w = mTextureRegion.rect.w;
h = mTextureRegion.rect.h;
}
float ox = -w * mOffset.x;
float oy = -h * (1 - mOffset.y);