Changed Terrain Shader -> Terrain now has custom edges
This commit is contained in:
@ -11,6 +11,8 @@ import de.frajul.endlessroll.levels.TileData;
|
||||
|
||||
public class Tile extends Entity {
|
||||
|
||||
private int gridColumnCount;
|
||||
|
||||
public Tile(TileList.Type type, Texture texture, float edge, TileData data) {
|
||||
this(type, texture, edge, data.getX(), data.getWidth());
|
||||
}
|
||||
@ -27,6 +29,11 @@ public class Tile extends Entity {
|
||||
super.position.y = edge + super.height / 2;
|
||||
break;
|
||||
}
|
||||
gridColumnCount = (int) (width / height);
|
||||
gridColumnCount = Math.max(gridColumnCount, 3);
|
||||
}
|
||||
|
||||
public int getGridColumnCount() {
|
||||
return gridColumnCount;
|
||||
}
|
||||
}
|
||||
|
@ -1,24 +1,30 @@
|
||||
package de.frajul.endlessroll.entities.tileLists;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import de.frajul.endlessroll.data.SynchronizedArrayList;
|
||||
import de.frajul.endlessroll.entities.textures.Texture;
|
||||
import de.frajul.endlessroll.levels.TileData;
|
||||
import de.frajul.endlessroll.levels.worlds.World;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import de.frajul.endlessroll.main.GameLog;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class TileList extends SynchronizedArrayList<Tile> {
|
||||
|
||||
public enum Type {
|
||||
TERRAIN, CEILING;
|
||||
TERRAIN,
|
||||
CEILING;
|
||||
|
||||
public float calculateTileHeightFromEdge(float edge) {
|
||||
switch (this) {
|
||||
case TERRAIN:
|
||||
if (edge <= -0.6f)
|
||||
return 0.4f;
|
||||
return 1 + edge;
|
||||
case CEILING:
|
||||
if (edge >= 0.6f)
|
||||
return 0.4f;
|
||||
return 1 - edge;
|
||||
}
|
||||
return 0;
|
||||
@ -42,13 +48,24 @@ public class TileList extends SynchronizedArrayList<Tile> {
|
||||
this.texture = world.getCeilingTexture();
|
||||
this.endless = false;
|
||||
super.clear();
|
||||
for (TileData data : tileData)
|
||||
float lastRightEdge = -10;
|
||||
for (TileData data : tileData) {
|
||||
float leftEdge = data.getX() - data.getWidth() / 2;
|
||||
float rightEdge = data.getX() + data.getWidth() / 2;
|
||||
if (Math.abs(lastRightEdge - leftEdge) < 0.1f)
|
||||
GameLog.i("!!! Too small gap found !!! " + toMeters(lastRightEdge) + "m; " + lastRightEdge + "-"+leftEdge+"; iRight="+tileData.indexOf(data));
|
||||
lastRightEdge = rightEdge;
|
||||
super.add(new Tile(type, texture, edge, data));
|
||||
}
|
||||
this.edge = edge;
|
||||
if (edge >= 1 || edge <= -1)
|
||||
super.clear();
|
||||
}
|
||||
|
||||
private float toMeters(float value) {
|
||||
return ((int) (value * 20)) / 10f;
|
||||
}
|
||||
|
||||
public void createEndless(World world, float edge) {
|
||||
loadData(world, edge, new ArrayList<TileData>());
|
||||
super.add(createEndlessTile(0));
|
||||
@ -76,4 +93,7 @@ public class TileList extends SynchronizedArrayList<Tile> {
|
||||
return edge;
|
||||
}
|
||||
|
||||
public boolean isEndless() {
|
||||
return endless;
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,8 @@ import de.frajul.endlessroll.entities.textures.TexturePack;
|
||||
|
||||
public enum World {
|
||||
|
||||
GRASSLANDS("Grasslands", R.drawable.world_previews_grasslands, R.drawable.backgrounds_game_grass, R.drawable.terrain_t_grass, R.drawable.terrain_c_grass, R.drawable.obstacles_grass),
|
||||
ICY_MOUNTAINS("Icy Mountains", R.drawable.world_previews_icymountains, R.drawable.backgrounds_game_snow, R.drawable.terrain_t_ice, R.drawable.terrain_c_ice, R.drawable.obstacles_snow);
|
||||
GRASSLANDS(R.drawable.world_previews_grasslands, R.drawable.backgrounds_game_grass, R.drawable.terrain_t_grass, R.drawable.terrain_c_grass, R.drawable.obstacles_grass),
|
||||
ICY_MOUNTAINS(R.drawable.world_previews_icymountains, R.drawable.backgrounds_game_snow, R.drawable.terrain_t_ice, R.drawable.terrain_c_ice, R.drawable.obstacles_snow);
|
||||
|
||||
private String name;
|
||||
@DrawableRes
|
||||
@ -32,8 +32,7 @@ public enum World {
|
||||
private Texture ceiling;
|
||||
private Texture obstacle;
|
||||
|
||||
World(String name, @DrawableRes int previewId, @DrawableRes int backgroundId, @DrawableRes int terrainId, @DrawableRes int ceilingId, @DrawableRes int obstacleId) {
|
||||
this.name = name;
|
||||
World(@DrawableRes int previewId, @DrawableRes int backgroundId, @DrawableRes int terrainId, @DrawableRes int ceilingId, @DrawableRes int obstacleId) {
|
||||
this.previewId = previewId;
|
||||
this.backgroundId = backgroundId;
|
||||
this.terrainId = terrainId;
|
||||
@ -53,10 +52,6 @@ public enum World {
|
||||
obstacle = texturePack.loadAtlas(obstacleId, 8, 8);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getPreviewId() {
|
||||
return previewId;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import de.frajul.endlessroll.entities.particles.Firework;
|
||||
import de.frajul.endlessroll.entities.particles.ParticleEffect;
|
||||
import de.frajul.endlessroll.entities.particles.ParticleSource;
|
||||
import de.frajul.endlessroll.entities.particles.ParticleSystem;
|
||||
import de.frajul.endlessroll.entities.shapes.PlayerShape;
|
||||
import de.frajul.endlessroll.entities.textures.TexturePack;
|
||||
import de.frajul.endlessroll.levels.ObstacleData;
|
||||
import de.frajul.endlessroll.levels.worlds.World;
|
||||
@ -16,9 +17,10 @@ public class TestScreenScene extends Scene {
|
||||
|
||||
public TestScreenScene(GameActivity gameActivity, TexturePack texturePack, ParticleSystem particleSystem) {
|
||||
super(gameActivity, texturePack, particleSystem);
|
||||
terrain.createEndless(World.ICY_MOUNTAINS, -1.0f);
|
||||
terrain.createEndless(World.GRASSLANDS, 0.6f);
|
||||
background.changeTexture(World.ICY_MOUNTAINS.getBackgroundTexture());
|
||||
new ParticleSource(new Vector(0, 0.0f), particleSystem.colorChange).start();
|
||||
}
|
||||
|
||||
player.init(PlayerShape.BALL, 0.6f, 0.5f, 0.5f, particleSystem);
|
||||
uncategorizedEntities.add(player);
|
||||
}
|
||||
}
|
@ -189,11 +189,13 @@ public class GameRenderer implements GLSurfaceView.Renderer {
|
||||
private void renderTileList(GL10 gl, TileList tileList, Scene scene) {
|
||||
terrainShader.start();
|
||||
terrainShader.loadMVPMatrix(matrixCreator, scene.getCamera());
|
||||
terrainShader.loadIsEndlessTileList(tileList.isEndless());
|
||||
synchronized (tileList) {
|
||||
for (Tile tile : tileList) {
|
||||
gl.glActiveTexture(GL10.GL_TEXTURE0);
|
||||
gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId());
|
||||
terrainShader.loadTransformationMatrix(matrixCreator, tile);
|
||||
terrainShader.loadGridColumnCount(tile.getGridColumnCount());
|
||||
quad.draw();
|
||||
}
|
||||
}
|
||||
|
@ -14,15 +14,27 @@ public class TerrainShader extends ShaderProgram {
|
||||
|
||||
private int location_mvpMatrix;
|
||||
private int location_transformationMatrix;
|
||||
private int location_gridColumnCount;
|
||||
private int location_isEndlessTileList;
|
||||
|
||||
public TerrainShader(Context context) throws Exception {
|
||||
super(context, "shader/terrainVertexShader.glsl", "shader/simpleFragmentShader.glsl");
|
||||
super(context, "shader/entityVertexShader.glsl", "shader/terrainFragmentShader.glsl");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadUniformLocations() {
|
||||
location_mvpMatrix = super.getUniformLocation("mvpMatrix");
|
||||
location_transformationMatrix = super.getUniformLocation("transformationMatrix");
|
||||
location_gridColumnCount = super.getUniformLocation("gridColumnCount");
|
||||
location_isEndlessTileList = super.getUniformLocation("isEndlessTileList");
|
||||
}
|
||||
|
||||
public void loadGridColumnCount(int gridColumnCount) {
|
||||
GLES20.glUniform1f(location_gridColumnCount, gridColumnCount);
|
||||
}
|
||||
|
||||
public void loadIsEndlessTileList(boolean endless) {
|
||||
GLES20.glUniform1f(location_isEndlessTileList, endless ? 1f : 0f);
|
||||
}
|
||||
|
||||
public void loadMVPMatrix(MatrixCreator matrixCreator, Camera camera) {
|
||||
|
Reference in New Issue
Block a user