Changed Terrain Shader -> Terrain now has custom edges

This commit is contained in:
=
2018-02-16 16:30:45 +01:00
parent b4ad6a7227
commit 8dc99fb59f
17 changed files with 116 additions and 62 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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) {