Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Terrain Layering Feature #129

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,18 @@
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.mbrlabs.mundus.commons.assets.meta.Meta;
import com.mbrlabs.mundus.commons.assets.meta.MetaTerrainLayer;
import com.mbrlabs.mundus.commons.terrain.SplatMap;
import com.mbrlabs.mundus.commons.terrain.SplatTexture;
import com.mbrlabs.mundus.commons.terrain.Terrain;
import com.mbrlabs.mundus.commons.terrain.TerrainLoader;
import com.mbrlabs.mundus.commons.terrain.TerrainMaterial;
import com.mbrlabs.mundus.commons.terrain.attributes.TerrainLayerAttribute;
import com.mbrlabs.mundus.commons.terrain.layers.HeightTerrainLayer;
import com.mbrlabs.mundus.commons.terrain.layers.SlopeTerrainLayer;
import com.mbrlabs.mundus.commons.terrain.layers.TerrainLayer;

import java.util.Map;

Expand All @@ -50,6 +56,8 @@ public class TerrainAsset extends Asset {
private TextureAsset splatBNormal;
private TextureAsset splatGNormal;
private TextureAsset splatANormal;
private Array<TerrainLayer> heightLayers;
private Array<TerrainLayer> slopeLayers;

private Terrain terrain;

Expand Down Expand Up @@ -304,6 +312,44 @@ public void resolveDependencies(Map<String, Asset> assets) {
if (id != null && assets.containsKey(id)) {
setSplatANormal((TextureAsset) assets.get(id));
}

// Height layers
if (meta.getTerrain().getHeightLayers() != null) {
for (MetaTerrainLayer metaLayer : meta.getTerrain().getHeightLayers()) {
if (heightLayers == null) heightLayers = new Array<>();

TextureAsset texAsset = (TextureAsset) assets.get(metaLayer.getTextureAssetId());

HeightTerrainLayer terrainLayer = new HeightTerrainLayer(texAsset, metaLayer.getMinHeight(), metaLayer.getMaxHeight());
terrainLayer.setName(metaLayer.getName());
terrainLayer.active = metaLayer.isActive();

if (metaLayer.getNormalTextureAssetId() != null) {
terrainLayer.normalTextureAsset = (TextureAsset) assets.get(metaLayer.getNormalTextureAssetId());
}

heightLayers.add(terrainLayer);
}
}

// Slope layers
if (meta.getTerrain().getSlopeLayers() != null) {
for (MetaTerrainLayer metaLayer : meta.getTerrain().getSlopeLayers()) {
if (slopeLayers == null) slopeLayers = new Array<>();

TextureAsset texAsset = (TextureAsset) assets.get(metaLayer.getTextureAssetId());

SlopeTerrainLayer terrainLayer = new SlopeTerrainLayer(texAsset, metaLayer.getMinHeight(), metaLayer.getMaxHeight(), metaLayer.getSlopeStrength());
terrainLayer.setName(metaLayer.getName());
terrainLayer.active = metaLayer.isActive();

if (metaLayer.getNormalTextureAssetId() != null) {
terrainLayer.normalTextureAsset = (TextureAsset) assets.get(metaLayer.getNormalTextureAssetId());
}

slopeLayers.add(terrainLayer);
}
}
}

@Override
Expand Down Expand Up @@ -367,6 +413,22 @@ public void applyDependencies() {
terrainMaterial.setSplatNormalTexture(new SplatTexture(SplatTexture.Channel.A, splatANormal));
}

if (heightLayers == null) {
terrainMaterial.remove(TerrainLayerAttribute.HeightLayer);
} else {
TerrainLayerAttribute attr = new TerrainLayerAttribute(TerrainLayerAttribute.HeightLayer);
attr.terrainLayers.addAll(heightLayers);
terrainMaterial.set(attr);
}

if (slopeLayers == null) {
terrainMaterial.remove(TerrainLayerAttribute.SlopeLayer);
} else {
TerrainLayerAttribute attr = new TerrainLayerAttribute(TerrainLayerAttribute.SlopeLayer);
attr.terrainLayers.addAll(slopeLayers);
terrainMaterial.set(attr);
}

terrain.update();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.mbrlabs.mundus.commons.assets.meta;

import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.JsonReader;
import com.badlogic.gdx.utils.JsonValue;
import com.mbrlabs.mundus.commons.assets.AssetType;
Expand Down Expand Up @@ -74,9 +75,51 @@ private void parseTerrain(Meta meta, JsonValue jsonTerrain) {
terrain.setSplatBNormal(jsonTerrain.getString(MetaTerrain.JSON_SPLAT_B_NORMAL, null));
terrain.setSplatANormal(jsonTerrain.getString(MetaTerrain.JSON_SPLAT_A_NORMAL, null));

// Load Terrain Layers
Array<MetaTerrainLayer> hLayers = parseTerrainLayers(jsonTerrain.get(MetaTerrain.JSON_HEIGHT_LAYERS), false);
Array<MetaTerrainLayer> sLayers = parseTerrainLayers(jsonTerrain.get(MetaTerrain.JSON_SLOPE_LAYERS), true);
terrain.setHeightLayers(hLayers);
terrain.setSlopeLayers(sLayers);

meta.setTerrain(terrain);
}

/**
* Converts JsonValue Array of terrain layers into MetaTerrainLayer for
* loading the layer in the future.
*/
private Array<MetaTerrainLayer> parseTerrainLayers(JsonValue layerArray, boolean isSlopeLayer) {
if (layerArray == null) return null;

Array<MetaTerrainLayer> layers = null;

// Get first layer of array
JsonValue child = layerArray.child;

while (child != null) {
if (layers == null) layers = new Array<>();

MetaTerrainLayer metaTerrainLayer = new MetaTerrainLayer();
metaTerrainLayer.setName(child.getString(MetaTerrain.JSON_HEIGHT_LAYER_NAME));
metaTerrainLayer.setActive(child.getBoolean(MetaTerrain.JSON_HEIGHT_LAYER_ACTIVE));
metaTerrainLayer.setTextureAssetId(child.getString(MetaTerrain.JSON_LAYER_TEXTURE_ASSET));
metaTerrainLayer.setNormalTextureAssetId(child.getString(MetaTerrain.JSON_LAYER_NORMAL_TEXTURE_ASSET, null));
metaTerrainLayer.setMaxHeight(child.getFloat(MetaTerrain.JSON_HEIGHT_LAYER_MAX_HEIGHT));
metaTerrainLayer.setMinHeight(child.getFloat(MetaTerrain.JSON_HEIGHT_LAYER_MIN_HEIGHT));

if (isSlopeLayer) {
metaTerrainLayer.setSlopeStrength(child.getFloat(MetaTerrain.JSON_LAYER_SLOPE_STRENGTH));
}

layers.add(metaTerrainLayer);

// Get next array element
child = child.next();
}

return layers;
}

private void parseModel(Meta meta, JsonValue jsonModel) {
if(jsonModel == null) return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package com.mbrlabs.mundus.commons.assets.meta;

import com.badlogic.gdx.utils.Array;

/**
*
* @author Marcus Brummer
Expand All @@ -38,6 +40,15 @@ public class MetaTerrain {
public static final String JSON_SPLAT_B_NORMAL = "bNorm";
public static final String JSON_SPLAT_A_NORMAL = "aNorm";
public static final String JSON_UV_SCALE= "uv";
public static final String JSON_HEIGHT_LAYERS = "hLayers";
public static final String JSON_SLOPE_LAYERS = "sLayers";
public static final String JSON_LAYER_TEXTURE_ASSET = "asset";
public static final String JSON_LAYER_NORMAL_TEXTURE_ASSET = "assetNorm";
public static final String JSON_HEIGHT_LAYER_ACTIVE = "active";
public static final String JSON_HEIGHT_LAYER_NAME = "name";
public static final String JSON_HEIGHT_LAYER_MIN_HEIGHT = "minH";
public static final String JSON_HEIGHT_LAYER_MAX_HEIGHT = "maxH";
public static final String JSON_LAYER_SLOPE_STRENGTH = "slopeStr";

private int size;
private int splatMapResolution;
Expand All @@ -54,6 +65,8 @@ public class MetaTerrain {
private String splatGNormal;
private String splatBNormal;
private String splatANormal;
private Array<MetaTerrainLayer> heightLayers;
private Array<MetaTerrainLayer> slopeLayers;

public String getSplatmap() {
return splatmap;
Expand Down Expand Up @@ -175,6 +188,22 @@ public void setSplatANormal(String splatANormal) {
this.splatANormal = splatANormal;
}

public Array<MetaTerrainLayer> getHeightLayers() {
return heightLayers;
}

public void setHeightLayers(Array<MetaTerrainLayer> heightLayers) {
this.heightLayers = heightLayers;
}

public Array<MetaTerrainLayer> getSlopeLayers() {
return slopeLayers;
}

public void setSlopeLayers(Array<MetaTerrainLayer> slopeLayers) {
this.slopeLayers = slopeLayers;
}

@Override
public String toString() {
return "MetaTerrain{" +
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.mbrlabs.mundus.commons.assets.meta;

/**
* Simple POJO for the loading and saving of Terrain Layers
* @author JamesTKhan
* @version November 09, 2022
*/
public class MetaTerrainLayer {
private String name;
private String textureAssetId;
private String normalTextureAssetId;
private boolean active;
private float minHeight;
private float maxHeight;
private float slopeStrength;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getTextureAssetId() {
return textureAssetId;
}

public void setTextureAssetId(String textureAssetId) {
this.textureAssetId = textureAssetId;
}

public String getNormalTextureAssetId() {
return normalTextureAssetId;
}

public void setNormalTextureAssetId(String normalTextureAssetId) {
this.normalTextureAssetId = normalTextureAssetId;
}

public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}

public float getMinHeight() {
return minHeight;
}

public void setMinHeight(float minHeight) {
this.minHeight = minHeight;
}

public float getMaxHeight() {
return maxHeight;
}

public void setMaxHeight(float maxHeight) {
this.maxHeight = maxHeight;
}

public float getSlopeStrength() {
return slopeStrength;
}

public void setSlopeStrength(float slopeStrength) {
this.slopeStrength = slopeStrength;
}
}
Loading