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

@ -29,7 +29,6 @@
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="6.436699" width="18.873398"/>
<tileData x="20.385015" width="9.023236"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="false" moving="false" deadly="false" leftEdge="2.3533306" rightEdge="5.3533306" height="0.331" y="-0.43450004">
@ -247,7 +246,6 @@
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="2.700005" width="11.40001"/>
<tileData x="17.183376" width="16.56669"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="false" moving="false" deadly="false" leftEdge="1.656666" rightEdge="1.8566661" height="0.815" y="-0.19250003">

View File

@ -1,18 +0,0 @@
uniform mat4 mvpMatrix;
uniform mat4 transformationMatrix;
attribute vec4 position;
attribute vec2 texCoords;
varying vec2 pass_TexCoords;
void main() {
vec4 transformatedPosition = transformationMatrix * position;
gl_Position = mvpMatrix * transformatedPosition;
pass_TexCoords = (transformationMatrix * vec4(texCoords, 0.0, 0.0)).xy;
pass_TexCoords *= vec2(3.0, 3.0);
pass_TexCoords.y = clamp(pass_TexCoords.y, 0.0, 1.0) + 0.01;
}

View File

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main"><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets"><file name="fontBaron.ttf" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\fontBaron.ttf"/><file name="levelpacks/Grasslands.xml" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\levelpacks\Grasslands.xml"/><file name="levelpacks/Icy Mountains.xml" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\levelpacks\Icy Mountains.xml"/><file name="particleEffects/collectEnergy.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\collectEnergy.pe"/><file name="particleEffects/collectStar.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\collectStar.pe"/><file name="particleEffects/colorChange.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\colorChange.pe"/><file name="particleEffects/explosion.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\explosion.pe"/><file name="particleEffects/firework.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\firework.pe"/><file name="particleEffects/magnet.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\magnet.pe"/><file name="particleEffects/particle.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\particle.png"/><file name="particleEffects/star.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\star.png"/><file name="particleEffects/stasis.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\stasis.pe"/><file name="particleEffects/superPower.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\superPower.pe"/><file name="particleEffects/test_fire.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\test_fire.pe"/><file name="shader/entityFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\entityFragmentShader.glsl"/><file name="shader/entityVertexShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\entityVertexShader.glsl"/><file name="shader/obstacleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\obstacleFragmentShader.glsl"/><file name="shader/particleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\particleFragmentShader.glsl"/><file name="shader/simpleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\simpleFragmentShader.glsl"/><file name="shader/simpleVertexShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\simpleVertexShader.glsl"/><file name="shader/terrainVertexShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\terrainVertexShader.glsl"/><file name="particleEffects/snow.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\snow.pe"/><file name="particleEffects/snow.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\snow.png"/></source><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\build\generated\assets\shaders\debug"/></dataSet><dataSet config="debug"><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\debug\assets"/></dataSet></merger>
<merger version="3"><dataSet config="main"><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets"><file name="fontBaron.ttf" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\fontBaron.ttf"/><file name="levelpacks/Grasslands.xml" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\levelpacks\Grasslands.xml"/><file name="levelpacks/Icy Mountains.xml" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\levelpacks\Icy Mountains.xml"/><file name="particleEffects/collectEnergy.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\collectEnergy.pe"/><file name="particleEffects/collectStar.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\collectStar.pe"/><file name="particleEffects/colorChange.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\colorChange.pe"/><file name="particleEffects/explosion.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\explosion.pe"/><file name="particleEffects/firework.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\firework.pe"/><file name="particleEffects/magnet.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\magnet.pe"/><file name="particleEffects/particle.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\particle.png"/><file name="particleEffects/star.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\star.png"/><file name="particleEffects/stasis.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\stasis.pe"/><file name="particleEffects/superPower.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\superPower.pe"/><file name="particleEffects/test_fire.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\test_fire.pe"/><file name="shader/entityFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\entityFragmentShader.glsl"/><file name="shader/entityVertexShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\entityVertexShader.glsl"/><file name="shader/obstacleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\obstacleFragmentShader.glsl"/><file name="shader/particleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\particleFragmentShader.glsl"/><file name="shader/simpleFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\simpleFragmentShader.glsl"/><file name="shader/simpleVertexShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\simpleVertexShader.glsl"/><file name="particleEffects/snow.pe" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\snow.pe"/><file name="particleEffects/snow.png" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\particleEffects\snow.png"/><file name="shader/terrainFragmentShader.glsl" path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\main\assets\shader\terrainFragmentShader.glsl"/></source><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\build\generated\assets\shaders\debug"/></dataSet><dataSet config="debug"><source path="C:\Users\Julian\AndroidStudioProjects\EndlessRoll\app\src\debug\assets"/></dataSet></merger>

View File

@ -29,7 +29,6 @@
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="6.436699" width="18.873398"/>
<tileData x="20.385015" width="9.023236"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="false" moving="false" deadly="false" leftEdge="2.3533306" rightEdge="5.3533306" height="0.331" y="-0.43450004">
@ -247,7 +246,6 @@
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="2.700005" width="11.40001"/>
<tileData x="17.183376" width="16.56669"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="false" moving="false" deadly="false" leftEdge="1.656666" rightEdge="1.8566661" height="0.815" y="-0.19250003">

View File

@ -7,12 +7,10 @@
<tileData x="8.559853" width="0.42468548"/>
<tileData x="14.852292" width="3.8621922"/>
<tileData x="19.439503" width="4.192238"/>
<tileData x="24.228848" width="3.6224518"/>
<tileData x="28.089983" width="4.099819"/>
<tileData x="26.278606" width="7.721974"/>
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="11.520037" width="29.040073"/>
<tileData x="26.26674" width="0.45332718"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="true" moving="true" deadly="true" leftEdge="0.65783304" rightEdge="0.988833" height="0.51" y="-0.34500003">
@ -167,7 +165,6 @@
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="8.863336" width="23.726671"/>
<tileData x="23.293339" width="5.1333294"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList">
<obstacleData floating="true" moving="true" deadly="false" leftEdge="-0.34966657" rightEdge="0.23633346" height="0.344" y="-0.91999984">
@ -435,5 +432,18 @@
</stars>
<energy x="18.570074" y="0.46666658"/>
</level>
<level packId="2" id="7" goalX="3.0" startSpeed="0.5" endSpeed="0.5" terrainEdge="-0.6" ceilingEdge="1.0">
<terrainTiles class="java.util.ArrayList">
<tileData x="0.0" width="6.0"/>
</terrainTiles>
<ceilingTiles class="java.util.ArrayList">
<tileData x="0.0" width="6.0"/>
</ceilingTiles>
<obstacles class="java.util.ArrayList"/>
<stars class="java.util.ArrayList">
<positionData x="0.3066666" y="-0.37999997"/>
</stars>
<energy x="1.9466664" y="-0.3933333"/>
</level>
</levels>
</levelPack>

View File

@ -0,0 +1,46 @@
precision mediump float;
uniform sampler2D texture;
uniform float gridColumnCount;
uniform float isEndlessTileList;
varying vec2 pass_TexCoords;
const float texAtlasWidth = 3.0;
float getAtlasIndex();
vec2 getTexCoordsInAtlas(in vec2 texCoordsInGrid, in float atlasIndex);
void main() {
float atlasIndex = getAtlasIndex();
vec2 texCoordsInGrid = pass_TexCoords;
texCoordsInGrid.x *= gridColumnCount;
texCoordsInGrid.x = mod(texCoordsInGrid.x, 1.0);
vec2 texCoordsInAtlas = getTexCoordsInAtlas(texCoordsInGrid, atlasIndex);
gl_FragColor = texture2D(texture, texCoordsInAtlas);
gl_FragColor.rgb = gl_FragColor.rgb / gl_FragColor.a;
}
float getAtlasIndex(){
if(isEndlessTileList == 1.0)
return 1.0;
if(pass_TexCoords.x < 1.0 / gridColumnCount)
return 0.0;
if(pass_TexCoords.x > 1.0 - 1.0 / gridColumnCount)
return 2.0;
return 1.0;
}
vec2 getTexCoordsInAtlas(in vec2 texCoordsInGrid, in float atlasIndex){
vec2 texAtlasCoords = vec2(0.0, texCoordsInGrid.y);
texAtlasCoords.x = texCoordsInGrid.x / texAtlasWidth;
texAtlasCoords.x += mod(atlasIndex, texAtlasWidth) / texAtlasWidth;
return texAtlasCoords;
}

View File

@ -1,18 +0,0 @@
uniform mat4 mvpMatrix;
uniform mat4 transformationMatrix;
attribute vec4 position;
attribute vec2 texCoords;
varying vec2 pass_TexCoords;
void main() {
vec4 transformatedPosition = transformationMatrix * position;
gl_Position = mvpMatrix * transformatedPosition;
pass_TexCoords = (transformationMatrix * vec4(texCoords, 0.0, 0.0)).xy;
pass_TexCoords *= vec2(3.0, 3.0);
pass_TexCoords.y = clamp(pass_TexCoords.y, 0.0, 1.0) + 0.01;
}

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 35 KiB