move example renderer to playground
This commit is contained in:
parent
ff56d5c67a
commit
ea711aea77
@ -1,143 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.oscim.renderer.test;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import org.oscim.backend.canvas.Color;
|
|
||||||
import org.oscim.backend.canvas.Paint.Cap;
|
|
||||||
import org.oscim.renderer.ElementRenderer;
|
|
||||||
import org.oscim.renderer.GLViewport;
|
|
||||||
import org.oscim.renderer.atlas.TextureAtlas;
|
|
||||||
import org.oscim.renderer.atlas.TextureAtlas.Rect;
|
|
||||||
import org.oscim.renderer.atlas.TextureAtlas.Slot;
|
|
||||||
import org.oscim.renderer.elements.LineLayer;
|
|
||||||
import org.oscim.renderer.elements.TextItem;
|
|
||||||
import org.oscim.renderer.elements.TextLayer;
|
|
||||||
import org.oscim.theme.styles.LineStyle;
|
|
||||||
import org.oscim.theme.styles.TextStyle;
|
|
||||||
import org.oscim.theme.styles.TextStyle.TextBuilder;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
public class AtlasRenderLayer extends ElementRenderer {
|
|
||||||
|
|
||||||
Logger log = LoggerFactory.getLogger(AtlasRenderLayer.class);
|
|
||||||
|
|
||||||
public AtlasRenderLayer() {
|
|
||||||
|
|
||||||
TextureAtlas mAtlas = TextureAtlas.create(2048, 2048, 1);
|
|
||||||
|
|
||||||
LineLayer ll = layers.getLineLayer(0);
|
|
||||||
ll.line = new LineStyle(Color.BLUE, 3, Cap.BUTT);
|
|
||||||
ll.scale = 1f;
|
|
||||||
|
|
||||||
LineLayer ll2 = layers.getLineLayer(1);
|
|
||||||
ll2.line = new LineStyle(Color.RED, 3, Cap.BUTT);
|
|
||||||
ll2.scale = 1f;
|
|
||||||
|
|
||||||
LineLayer ll3 = layers.getLineLayer(2);
|
|
||||||
ll3.line = new LineStyle(Color.GREEN, 3, Cap.BUTT);
|
|
||||||
ll3.scale = 1f;
|
|
||||||
|
|
||||||
TextLayer tl = new TextLayer();
|
|
||||||
TextStyle t = new TextBuilder().setFontSize(20).setColor(Color.BLACK).build();
|
|
||||||
layers.setTextureLayers(tl);
|
|
||||||
|
|
||||||
float[] points = new float[10];
|
|
||||||
|
|
||||||
for (int i = 0; i < 400; i++) {
|
|
||||||
int w = (int) (20 + Math.random() * 256);
|
|
||||||
int h = (int) (20 + Math.random() * 56);
|
|
||||||
Rect r = mAtlas.getRegion(w, h);
|
|
||||||
if (r == null) {
|
|
||||||
log.debug("no space left");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
r.x += 1;
|
|
||||||
r.y += 1;
|
|
||||||
|
|
||||||
points[0] = r.x;
|
|
||||||
points[1] = r.y;
|
|
||||||
points[2] = r.x + (r.w - 2);
|
|
||||||
points[3] = r.y;
|
|
||||||
points[4] = r.x + (r.w - 2);
|
|
||||||
points[5] = r.y + (r.h - 2);
|
|
||||||
points[6] = r.x;
|
|
||||||
points[7] = r.y + (r.h - 2);
|
|
||||||
points[8] = r.x;
|
|
||||||
points[9] = r.y;
|
|
||||||
ll.addLine(points, 10, false);
|
|
||||||
|
|
||||||
r.x += 1;
|
|
||||||
r.y += 1;
|
|
||||||
points[0] = r.x;
|
|
||||||
points[1] = r.y;
|
|
||||||
points[2] = r.x + (w - 4);
|
|
||||||
points[3] = r.y;
|
|
||||||
points[4] = r.x + (w - 4);
|
|
||||||
points[5] = r.y + (h - 4);
|
|
||||||
points[6] = r.x;
|
|
||||||
points[7] = r.y + (h - 4);
|
|
||||||
points[8] = r.x;
|
|
||||||
points[9] = r.y;
|
|
||||||
|
|
||||||
log.debug("add region: " + Arrays.toString(points));
|
|
||||||
ll2.addLine(points, 10, false);
|
|
||||||
|
|
||||||
TextItem ti = TextItem.pool.get();
|
|
||||||
ti.set(r.x + r.w / 2, r.y + r.h / 2, "" + i, t);
|
|
||||||
|
|
||||||
ti.x1 = 0;
|
|
||||||
ti.y1 = 1; // (short) (size / 2);
|
|
||||||
ti.x2 = 1; // (short) size;
|
|
||||||
ti.y2 = 1;
|
|
||||||
tl.addText(ti);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Slot s = mAtlas.mSlots; s != null; s = s.next) {
|
|
||||||
points[0] = s.x;
|
|
||||||
points[1] = s.y;
|
|
||||||
points[2] = s.x + s.w;
|
|
||||||
points[3] = s.y;
|
|
||||||
points[4] = s.x + s.w;
|
|
||||||
points[5] = 2048;
|
|
||||||
points[6] = s.x;
|
|
||||||
points[7] = 2048;
|
|
||||||
points[8] = s.x;
|
|
||||||
points[9] = s.y;
|
|
||||||
|
|
||||||
ll3.addLine(points, 10, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
tl.prepare();
|
|
||||||
tl.labels = TextItem.pool.releaseAll(tl.labels);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean initial = true;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void update(GLViewport v) {
|
|
||||||
|
|
||||||
if (initial) {
|
|
||||||
mMapPosition.copy(v.pos);
|
|
||||||
initial = false;
|
|
||||||
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
package org.oscim.renderer.test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.oscim.backend.canvas.Color;
|
|
||||||
import org.oscim.core.GeometryBuffer;
|
|
||||||
import org.oscim.core.Point;
|
|
||||||
import org.oscim.renderer.ElementRenderer;
|
|
||||||
import org.oscim.renderer.GLViewport;
|
|
||||||
import org.oscim.renderer.elements.LineLayer;
|
|
||||||
import org.oscim.theme.styles.LineStyle;
|
|
||||||
import org.oscim.utils.geom.BezierPath;
|
|
||||||
|
|
||||||
public class BezierPathLayer extends ElementRenderer {
|
|
||||||
|
|
||||||
public BezierPathLayer() {
|
|
||||||
mMapPosition.scale = 0;
|
|
||||||
|
|
||||||
GeometryBuffer g = new GeometryBuffer(100, 1);
|
|
||||||
g.startLine();
|
|
||||||
|
|
||||||
Point[] pts = new Point[10];
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
pts[i] = new Point(i * 3, (i * i) % 3 * 4);
|
|
||||||
pts[i].x *= 10;
|
|
||||||
pts[i].y *= 10;
|
|
||||||
// System.out.println(pts[i]);
|
|
||||||
g.addPoint(pts[i]);
|
|
||||||
}
|
|
||||||
LineLayer ll = layers.addLineLayer(0, new LineStyle(Color.BLUE, 2f));
|
|
||||||
ll.addLine(g);
|
|
||||||
|
|
||||||
List<Point> ctrl = BezierPath.cubicSplineControlPoints(pts, 0.1f);
|
|
||||||
|
|
||||||
g.clear();
|
|
||||||
g.startLine();
|
|
||||||
Point p0 = pts[0];
|
|
||||||
|
|
||||||
for (int j = 1, k = 0; j < pts.length; j++) {
|
|
||||||
Point p1 = ctrl.get(k++);
|
|
||||||
Point p2 = ctrl.get(k++);
|
|
||||||
Point p3 = pts[j];
|
|
||||||
System.out.println(">>> " + p1 + " " + p2);
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
double mu = (i / 10f);
|
|
||||||
Point p = BezierPath.cubicBezier(p0, p1, p2, p3, mu);
|
|
||||||
g.addPoint(p);
|
|
||||||
System.out.println(mu + " " + p);
|
|
||||||
}
|
|
||||||
p0 = p3;
|
|
||||||
}
|
|
||||||
ll = layers.addLineLayer(1, new LineStyle(Color.CYAN, 2f));
|
|
||||||
ll.addLine(g);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void clear() {
|
|
||||||
layers.clear();
|
|
||||||
setReady(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected synchronized void update(GLViewport v) {
|
|
||||||
|
|
||||||
if (mMapPosition.scale == 0)
|
|
||||||
mMapPosition.copy(v.pos);
|
|
||||||
|
|
||||||
if (!isReady()) {
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,163 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.oscim.renderer.test;
|
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
|
||||||
import java.nio.FloatBuffer;
|
|
||||||
|
|
||||||
import org.oscim.backend.GL20;
|
|
||||||
import org.oscim.core.MapPosition;
|
|
||||||
import org.oscim.map.Map;
|
|
||||||
import org.oscim.renderer.GLState;
|
|
||||||
import org.oscim.renderer.GLUtils;
|
|
||||||
import org.oscim.renderer.GLViewport;
|
|
||||||
import org.oscim.renderer.LayerRenderer;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is an example how to integrate custom OpenGL drawing routines as map overlay
|
|
||||||
*
|
|
||||||
* based on chapter 2 from:
|
|
||||||
* https://github.com/dalinaum/opengl-es-book-samples/tree/master/Android
|
|
||||||
* */
|
|
||||||
|
|
||||||
public class CustomRenderer extends LayerRenderer {
|
|
||||||
|
|
||||||
private final Map mMap;
|
|
||||||
private final MapPosition mMapPosition;
|
|
||||||
|
|
||||||
private int mProgramObject;
|
|
||||||
private int hVertexPosition;
|
|
||||||
private int hMatrixPosition;
|
|
||||||
|
|
||||||
private FloatBuffer mVertices;
|
|
||||||
private final float[] mVerticesData = {
|
|
||||||
-200, -200, 1.0f,
|
|
||||||
200, 200, 0,
|
|
||||||
-200, 200, 0.5f,
|
|
||||||
200, -200, 0.5f,
|
|
||||||
};
|
|
||||||
private boolean mInitialized;
|
|
||||||
|
|
||||||
public CustomRenderer(Map map) {
|
|
||||||
mMap = map;
|
|
||||||
mMapPosition = new MapPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- everything below runs in GLRender Thread ----------
|
|
||||||
@Override
|
|
||||||
protected void update(GLViewport v) {
|
|
||||||
if (!mInitialized) {
|
|
||||||
if (!init())
|
|
||||||
return;
|
|
||||||
|
|
||||||
mInitialized = true;
|
|
||||||
|
|
||||||
// fix current MapPosition
|
|
||||||
mMapPosition.copy(v.pos);
|
|
||||||
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void compile() {
|
|
||||||
// modify mVerticesData and put in FloatBuffer
|
|
||||||
|
|
||||||
mVertices.clear();
|
|
||||||
mVertices.put(mVerticesData);
|
|
||||||
mVertices.flip();
|
|
||||||
|
|
||||||
setReady(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void render(GLViewport v) {
|
|
||||||
|
|
||||||
// Use the program object
|
|
||||||
GLState.useProgram(mProgramObject);
|
|
||||||
|
|
||||||
GLState.blend(true);
|
|
||||||
GLState.test(false, false);
|
|
||||||
|
|
||||||
// unbind previously bound VBOs
|
|
||||||
GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
// Load the vertex data
|
|
||||||
//mVertices.position(0);
|
|
||||||
GL.glVertexAttribPointer(hVertexPosition, 3, GL20.GL_FLOAT, false, 0, mVertices);
|
|
||||||
//mVertices.position(2);
|
|
||||||
//GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_FLOAT, false, 4, mVertices);
|
|
||||||
|
|
||||||
GLState.enableVertexArrays(hVertexPosition, -1);
|
|
||||||
|
|
||||||
/* apply view and projection matrices */
|
|
||||||
// set mvp (tmp) matrix relative to mMapPosition
|
|
||||||
// i.e. fixed on the map
|
|
||||||
|
|
||||||
float ratio = 1f / mMap.getWidth();
|
|
||||||
|
|
||||||
v.mvp.setScale(ratio, ratio, 1);
|
|
||||||
v.mvp.multiplyLhs(v.proj);
|
|
||||||
v.mvp.setAsUniform(hMatrixPosition);
|
|
||||||
|
|
||||||
// Draw the triangle
|
|
||||||
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
|
|
||||||
|
|
||||||
GLUtils.checkGlError("...");
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean init() {
|
|
||||||
// Load the vertex/fragment shaders
|
|
||||||
int programObject = GLUtils.createProgram(vShaderStr, fShaderStr);
|
|
||||||
|
|
||||||
if (programObject == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Handle for vertex position in shader
|
|
||||||
hVertexPosition = GL.glGetAttribLocation(programObject, "a_pos");
|
|
||||||
|
|
||||||
hMatrixPosition = GL.glGetUniformLocation(programObject, "u_mvp");
|
|
||||||
|
|
||||||
// Store the program object
|
|
||||||
mProgramObject = programObject;
|
|
||||||
|
|
||||||
mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4)
|
|
||||||
.order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static String vShaderStr = "" +
|
|
||||||
"precision mediump float;"
|
|
||||||
+ "uniform mat4 u_mvp;"
|
|
||||||
+ "attribute vec4 a_pos;"
|
|
||||||
+ "varying float alpha;"
|
|
||||||
+ "void main()"
|
|
||||||
+ "{"
|
|
||||||
+ " gl_Position = u_mvp * vec4(a_pos.xy, 0.0, 1.0);"
|
|
||||||
+ " alpha = a_pos.z;"
|
|
||||||
+ "}";
|
|
||||||
|
|
||||||
private final static String fShaderStr = "" +
|
|
||||||
"precision mediump float;"
|
|
||||||
+ "varying float alpha;"
|
|
||||||
+ "void main()"
|
|
||||||
+ "{"
|
|
||||||
+ " gl_FragColor = vec4 (alpha, 1.0-alpha, 0.0, 0.7 );"
|
|
||||||
+ "}";
|
|
||||||
|
|
||||||
}
|
|
@ -1,207 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.oscim.renderer.test;
|
|
||||||
|
|
||||||
import java.nio.FloatBuffer;
|
|
||||||
|
|
||||||
import org.oscim.backend.GL20;
|
|
||||||
import org.oscim.backend.canvas.Color;
|
|
||||||
import org.oscim.renderer.BufferObject;
|
|
||||||
import org.oscim.renderer.ElementRenderer;
|
|
||||||
import org.oscim.renderer.GLState;
|
|
||||||
import org.oscim.renderer.GLUtils;
|
|
||||||
import org.oscim.renderer.GLViewport;
|
|
||||||
import org.oscim.renderer.MapRenderer;
|
|
||||||
import org.oscim.utils.FastMath;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is an example how to integrate custom OpenGL drawing routines as map overlay
|
|
||||||
*
|
|
||||||
* based on chapter 2 from:
|
|
||||||
* https://github.com/dalinaum/opengl-es-book-samples/tree/master/Android
|
|
||||||
* */
|
|
||||||
|
|
||||||
public class CustomRenderer2 extends ElementRenderer {
|
|
||||||
|
|
||||||
private int mProgramObject;
|
|
||||||
private int hVertexPosition;
|
|
||||||
private int hMatrixPosition;
|
|
||||||
private int hColorPosition;
|
|
||||||
private int hCenterPosition;
|
|
||||||
|
|
||||||
//private FloatBuffer mVertices;
|
|
||||||
private boolean mInitialized;
|
|
||||||
private BufferObject mVBO;
|
|
||||||
|
|
||||||
int mZoom = -1;
|
|
||||||
float mCellScale = 60 * MapRenderer.COORD_SCALE;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void update(GLViewport v) {
|
|
||||||
if (!mInitialized) {
|
|
||||||
if (!init())
|
|
||||||
return;
|
|
||||||
|
|
||||||
mInitialized = true;
|
|
||||||
|
|
||||||
compile();
|
|
||||||
// fix current MapPosition
|
|
||||||
|
|
||||||
//mMapPosition.setPosition(53.1, 8.8);
|
|
||||||
//mMapPosition.setZoomLevel(14);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mZoom != v.pos.zoomLevel) {
|
|
||||||
mMapPosition.copy(v.pos);
|
|
||||||
mZoom = v.pos.zoomLevel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void compile() {
|
|
||||||
|
|
||||||
float[] vertices = new float[12];
|
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++) {
|
|
||||||
vertices[i * 2 + 0] = (float) Math.cos(Math.PI * 2 * i / 6) * mCellScale;
|
|
||||||
vertices[i * 2 + 1] = (float) Math.sin(Math.PI * 2 * i / 6) * mCellScale;
|
|
||||||
}
|
|
||||||
FloatBuffer buf = MapRenderer.getFloatBuffer(12);
|
|
||||||
buf.put(vertices);
|
|
||||||
|
|
||||||
mVBO = BufferObject.get(GL20.GL_ARRAY_BUFFER, 0);
|
|
||||||
mVBO.loadBufferData(buf.flip(), 12 * 4);
|
|
||||||
|
|
||||||
setReady(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void render(GLViewport v) {
|
|
||||||
|
|
||||||
// Use the program object
|
|
||||||
GLState.useProgram(mProgramObject);
|
|
||||||
|
|
||||||
GLState.blend(true);
|
|
||||||
GLState.test(false, false);
|
|
||||||
|
|
||||||
// bind VBO data
|
|
||||||
mVBO.bind();
|
|
||||||
|
|
||||||
// set VBO vertex layout
|
|
||||||
GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_FLOAT, false, 0, 0);
|
|
||||||
|
|
||||||
GLState.enableVertexArrays(hVertexPosition, -1);
|
|
||||||
|
|
||||||
/* apply view and projection matrices */
|
|
||||||
// set mvp (tmp) matrix relative to mMapPosition
|
|
||||||
// i.e. fixed on the map
|
|
||||||
setMatrix(v);
|
|
||||||
v.mvp.setAsUniform(hMatrixPosition);
|
|
||||||
|
|
||||||
final int offset_x = 4;
|
|
||||||
final int offset_y = 16;
|
|
||||||
|
|
||||||
float h = (float) (Math.sqrt(3) / 2);
|
|
||||||
for (int y = -offset_y; y < offset_y; y++) {
|
|
||||||
for (int x = -offset_x; x < offset_x; x++) {
|
|
||||||
float xx = x * 2 + (y % 2 == 0 ? 1 : 0);
|
|
||||||
float yy = y * h + h / 2;
|
|
||||||
|
|
||||||
GL.glUniform2f(hCenterPosition, xx * (mCellScale * 1.5f), yy * mCellScale);
|
|
||||||
|
|
||||||
//float alpha = 1 + (float) Math.log10(FastMath.clamp(
|
|
||||||
// (float) Math.sqrt(xx * xx + yy * yy) / offset_y, 0.0f, 1.0f)) * 2;
|
|
||||||
|
|
||||||
float alpha = (float) Math.sqrt(xx * xx + yy * yy) / offset_y;
|
|
||||||
|
|
||||||
float fy = (float) (y + offset_y) / (offset_y * 2);
|
|
||||||
float fx = (float) (x + offset_x) / (offset_x * 2);
|
|
||||||
float fz = FastMath.clamp(
|
|
||||||
(float) (x < 0 || y < 0 ? 1 - Math.sqrt(fx * fx + fy * fy)
|
|
||||||
: 0),
|
|
||||||
0,
|
|
||||||
1);
|
|
||||||
|
|
||||||
int c = 0xff << 24
|
|
||||||
| (int) (0xff * fy) << 16
|
|
||||||
| (int) (0xff * fx) << 8
|
|
||||||
| (int) (0xff * fz);
|
|
||||||
|
|
||||||
GLUtils.setColor(hColorPosition, c, alpha);
|
|
||||||
|
|
||||||
GL.glDrawArrays(GL20.GL_TRIANGLE_FAN, 0, 6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GLUtils.setColor(hColorPosition, Color.DKGRAY, 0.3f);
|
|
||||||
|
|
||||||
for (int y = -offset_y; y < offset_y; y++) {
|
|
||||||
for (int x = -offset_x; x < offset_x; x++) {
|
|
||||||
float xx = x * 2 + (y % 2 == 0 ? 1 : 0);
|
|
||||||
float yy = y * h + h / 2;
|
|
||||||
|
|
||||||
GL.glUniform2f(hCenterPosition, xx * (mCellScale * 1.5f), yy * mCellScale);
|
|
||||||
GL.glDrawArrays(GL20.GL_LINE_LOOP, 0, 6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GLUtils.checkGlError("...");
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean init() {
|
|
||||||
// Load the vertex/fragment shaders
|
|
||||||
int programObject = GLUtils.createProgram(vShaderStr, fShaderStr);
|
|
||||||
|
|
||||||
if (programObject == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Handle for vertex position in shader
|
|
||||||
hVertexPosition = GL.glGetAttribLocation(programObject, "a_pos");
|
|
||||||
|
|
||||||
hMatrixPosition = GL.glGetUniformLocation(programObject, "u_mvp");
|
|
||||||
|
|
||||||
hColorPosition = GL.glGetUniformLocation(programObject, "u_color");
|
|
||||||
|
|
||||||
hCenterPosition = GL.glGetUniformLocation(programObject, "u_center");
|
|
||||||
|
|
||||||
// Store the program object
|
|
||||||
mProgramObject = programObject;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static String vShaderStr = "" +
|
|
||||||
"precision mediump float;"
|
|
||||||
+ "uniform mat4 u_mvp;"
|
|
||||||
+ "uniform vec2 u_center;"
|
|
||||||
+ "attribute vec2 a_pos;"
|
|
||||||
+ "void main()"
|
|
||||||
+ "{"
|
|
||||||
+ " gl_Position = u_mvp * vec4(u_center + a_pos, 0.0, 1.0);"
|
|
||||||
+ "}";
|
|
||||||
|
|
||||||
private final static String fShaderStr = "" +
|
|
||||||
"precision mediump float;"
|
|
||||||
+ "varying float alpha;"
|
|
||||||
+ "uniform vec4 u_color;"
|
|
||||||
+ "void main()"
|
|
||||||
+ "{"
|
|
||||||
+ " gl_FragColor = u_color;"
|
|
||||||
+ "}";
|
|
||||||
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.oscim.renderer.test;
|
|
||||||
|
|
||||||
import org.oscim.backend.CanvasAdapter;
|
|
||||||
import org.oscim.renderer.ElementRenderer;
|
|
||||||
import org.oscim.renderer.GLViewport;
|
|
||||||
import org.oscim.renderer.elements.SymbolItem;
|
|
||||||
import org.oscim.renderer.elements.SymbolLayer;
|
|
||||||
|
|
||||||
public class SymbolRenderLayer extends ElementRenderer {
|
|
||||||
boolean initialize = true;
|
|
||||||
|
|
||||||
public SymbolRenderLayer() {
|
|
||||||
SymbolLayer l = new SymbolLayer();
|
|
||||||
layers.setTextureLayers(l);
|
|
||||||
|
|
||||||
SymbolItem it = SymbolItem.pool.get();
|
|
||||||
it.billboard = false;
|
|
||||||
|
|
||||||
try {
|
|
||||||
it.bitmap = CanvasAdapter.g.loadBitmapAsset("jar:symbols/cafe.png");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
|
|
||||||
}
|
|
||||||
l.addSymbol(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void update(GLViewport v) {
|
|
||||||
if (initialize) {
|
|
||||||
initialize = false;
|
|
||||||
mMapPosition.copy(v.pos);
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user