Skip to content
Open
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
17 changes: 17 additions & 0 deletions schemas/materials.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,23 @@
"type": "number",
"description": "The gloss of specular reflections. Defaults to 0. Commonly ranges from 10 to 500."
},
"hexTilingScale": {
"type": "number",
"description": "The scale of the hexagonal tiling pattern. Defaults to 0.0 which disables hex tiling, anything greater enables it."
},
"hexTilingBlend": {
"type": "number",
"description": "The blending of the hexagonal tiling pattern. Defaults to 4.0."
},
"hexTilingMode": {
"type": "string",
"description": "Controls the Mode used to generate the base Hex UV:\n * Offset: Translate & Scales the Hex UV\n * Offset & Mirror: Flips U And/Or V components\n * Offset & Rotation: Applies a Discrete rotation to the UV",
"enum": [
"OFFSET",
"OFFSET_WITH_MIRROR",
"OFFSET_WITH_ROTATION"
]
},
"scrollSpeed": {
"type": "array",
"description": "The duration in seconds, per UV direction, before texture scrolling repeats. Defaults to [ 0, 0 ], which disables scrolling.",
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/rs117/hd/config/HexTilingMode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package rs117.hd.config;

public enum HexTilingMode {
OFFSET,
OFFSET_WITH_MIRROR,
OFFSET_WITH_ROTATION
}
2 changes: 2 additions & 0 deletions src/main/java/rs117/hd/opengl/uniforms/UBOMaterials.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public static class MaterialStruct extends StructProperty {
public Property displacementScale = addProperty(PropertyType.Float, "displacementScale");
public Property specularStrength = addProperty(PropertyType.Float, "specularStrength");
public Property specularGloss = addProperty(PropertyType.Float, "specularGloss");
public Property hexTilingScale = addProperty(PropertyType.Float, "hexTilingScale");
public Property hexTilingBlend = addProperty(PropertyType.Float, "hexTilingBlend");
public Property flowMapStrength = addProperty(PropertyType.Float, "flowMapStrength");
public Property flowMapDuration = addProperty(PropertyType.FVec2, "flowMapDuration");
public Property scrollDuration = addProperty(PropertyType.FVec2, "scrollDuration");
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/rs117/hd/scene/materials/Material.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import rs117.hd.config.HexTilingMode;
import rs117.hd.opengl.uniforms.UBOMaterials;
import rs117.hd.scene.MaterialManager;
import rs117.hd.scene.model_overrides.ModelOverride;
Expand Down Expand Up @@ -61,6 +62,9 @@ public class Material {
@JsonAdapter(ColorUtils.LinearAdapter.class)
public float brightness = 1;
private float displacementScale = .1f;
private float hexTilingScale = 0.0f;
private float hexTilingBlend = 4.0f;
private HexTilingMode hexTilingMode = HexTilingMode.OFFSET_WITH_ROTATION;
private float flowMapStrength;
private float[] flowMapDuration = { 0, 0 };
private float specularStrength;
Expand Down Expand Up @@ -211,6 +215,7 @@ public void fillMaterialStruct(
struct.flowMap.set(getTextureLayer(flowMap));
struct.shadowAlphaMap.set(getTextureLayer(shadowAlphaMap));
struct.flags.set(
(hexTilingMode.ordinal() & 0x3) << 3 |
(overrideBaseColor ? 1 : 0) << 2 |
(unlit ? 1 : 0) << 1 |
(hasTransparency ? 1 : 0)
Expand All @@ -219,6 +224,8 @@ public void fillMaterialStruct(
struct.displacementScale.set(displacementScale);
struct.specularStrength.set(specularStrength);
struct.specularGloss.set(specularGloss);
struct.hexTilingScale.set(hexTilingScale);
struct.hexTilingBlend.set(hexTilingBlend);
struct.flowMapStrength.set(flowMapStrength);
struct.flowMapDuration.set(flowMapDuration);
struct.scrollDuration.set(scrollSpeedX, scrollSpeedY);
Expand Down
10 changes: 8 additions & 2 deletions src/main/resources/rs117/hd/scene/materials.json
Original file line number Diff line number Diff line change
Expand Up @@ -1362,7 +1362,9 @@
"name": "GRAVEL",
"normalMap": "GRAVEL_N",
"specularStrength": 0.4,
"specularGloss": 130.0
"specularGloss": 130.0,
"hexTilingScale": 1.25,
"hexTilingBlend": 2.5
},
{
"name": "VERTICAL_GRAVEL",
Expand Down Expand Up @@ -1460,7 +1462,8 @@
"name": "GRUNGE_1",
"normalMap": "GRUNGE_1_N",
"specularStrength": 0.25,
"specularGloss": 30.0
"specularGloss": 30.0,
"hexTilingScale": 1.5
},
{
"name": "GRUNGE_1_LIGHT",
Expand Down Expand Up @@ -3125,6 +3128,9 @@
"normalMap": "HD_HAY_N",
"specularStrength": 0.175,
"specularGloss": 15.0,
"hexTilingScale": 1.5,
"hexTilingBlend": 1.5,
"hexTilingMode": "OFFSET_WITH_MIRROR",
"materialsToReplace": [
"HAY"
],
Expand Down
71 changes: 53 additions & 18 deletions src/main/resources/rs117/hd/scene_frag.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#define DISPLAY_TANGENT 0
#define DISPLAY_SHADOWS 0
#define DISPLAY_LIGHTING 0
#define DISPLAY_HEX 0

#include <uniforms/global.glsl>
#include <uniforms/world_views.glsl>
Expand Down Expand Up @@ -81,15 +82,21 @@ vec2 worldUvs(float scale) {
#include <utils/fog.glsl>
#include <utils/wireframe.glsl>
#include <utils/lights.glsl>
#include <utils/hex_tiling.glsl>
#include <utils/layered_sample.glsl>

void main() {
vec3 downDir = vec3(0, -1, 0);
// View & light directions are from the fragment to the camera/light
vec3 viewDir = normalize(cameraPos - IN.position);

Material material1 = getMaterial(fMaterialData[0] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK);
Material material2 = getMaterial(fMaterialData[1] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK);
Material material3 = getMaterial(fMaterialData[2] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK);
int materialIdx1 = fMaterialData[0] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK;
int materialIdx2 = fMaterialData[1] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK;
int materialIdx3 = fMaterialData[2] >> MATERIAL_INDEX_SHIFT & MATERIAL_INDEX_MASK;

Material material1 = getMaterial(materialIdx1);
Material material2 = getMaterial(materialIdx2);
Material material3 = getMaterial(materialIdx3);

// Water data
bool isTerrain = (fTerrainData[0] & 1) != 0; // 1 = 0b1
Expand Down Expand Up @@ -158,7 +165,6 @@ void main() {
uv3 += uvFlow * flowMapStrength;

// Set up tangent-space transformation matrix

vec3 N;
#if FLAT_SHADING && ZONE_RENDERER
N = normalize(fFlatNormal);
Expand Down Expand Up @@ -205,6 +211,27 @@ void main() {
fragPos += TBN * fragDelta;
#endif

// Build HexData, if Terrain use world space XZ otherwise UVs
float hexFadeMultiplier = distance(IN.position, cameraPos) < (TILE_SIZE * 40) ? 1.0 : 0.0;

HexShared hexShared = initHexShared(IN.position.xz / TILE_SIZE);
HexData hex1 = buildHexData(uv1, hexShared, material1.hexTilingScale * hexFadeMultiplier, material1.hexTilingBlend, getMaterialHexTilingMode(material1));

HexData hex2 = hex1;
if(materialIdx1 != materialIdx2 && (uv1 != uv2 || !isHexSamplingSame(material1, material2)))
hex2 = buildHexData(uv2, hexShared, material2.hexTilingScale * hexFadeMultiplier, material2.hexTilingBlend, getMaterialHexTilingMode(material2));

HexData hex3 = hex1;
if(materialIdx1 != materialIdx3 && (uv1 != uv3 || !isHexSamplingSame(material1, material3)))
hex3 = buildHexData(uv3, hexShared, material3.hexTilingScale * hexFadeMultiplier, material3.hexTilingBlend, getMaterialHexTilingMode(material3));

#if DISPLAY_HEX
if(hexShared.valid) {
FragColor = vec4(debugHex(hex1) * IN.texBlend.x + debugHex(hex2) * IN.texBlend.y + debugHex(hex3) * IN.texBlend.z, 1.0);
if (DISPLAY_HEX == 1) return; // Redundant, for syntax highlighting in IntelliJ
}
#endif

vec3 hsl1 = unpackRawHsl(fAlphaBiasHsl[0]);
vec3 hsl2 = unpackRawHsl(fAlphaBiasHsl[1]);
vec3 hsl3 = unpackRawHsl(fAlphaBiasHsl[2]);
Expand Down Expand Up @@ -237,9 +264,14 @@ void main() {
#endif

// get diffuse textures
vec4 texColor1 = colorMap1 == -1 ? vec4(1) : texture(textureArray, vec3(uv1, colorMap1), mipBias);
vec4 texColor2 = colorMap2 == -1 ? vec4(1) : texture(textureArray, vec3(uv2, colorMap2), mipBias);
vec4 texColor3 = colorMap3 == -1 ? vec4(1) : texture(textureArray, vec3(uv3, colorMap3), mipBias);
vec4 texColor1, texColor2, texColor3;
LAYERED_SAMPLE(texColor1, texColor2, texColor3,
colorMap1, colorMap2, colorMap3,
uv1, uv2, uv3,
hex1, hex2, hex3,
vec4(1)
);

texColor1.rgb *= material1.brightness;
texColor2.rgb *= material2.brightness;
texColor3.rgb *= material3.brightness;
Expand Down Expand Up @@ -318,9 +350,8 @@ void main() {
if ((fMaterialData[0] >> MATERIAL_FLAG_UPWARDS_NORMALS & 1) == 1) {
normals = vec3(0, -1, 0);
} else {
vec3 n1 = sampleNormalMap(material1, uv1, TBN);
vec3 n2 = sampleNormalMap(material2, uv2, TBN);
vec3 n3 = sampleNormalMap(material3, uv3, TBN);
vec3 n1, n2, n3;
LAYERED_SAMPLE_NORMAL(n1, n2, n3, uv1, uv2, uv3);
normals = normalize(n1 * IN.texBlend.x + n2 * IN.texBlend.y + n3 * IN.texBlend.z);
}

Expand All @@ -346,11 +377,14 @@ void main() {
// specular
vec3 vSpecularGloss = vec3(material1.specularGloss, material2.specularGloss, material3.specularGloss);
vec3 vSpecularStrength = vec3(material1.specularStrength, material2.specularStrength, material3.specularStrength);
vSpecularStrength *= vec3(
material1.roughnessMap == -1 ? 1 : linearToSrgb(texture(textureArray, vec3(uv1, material1.roughnessMap)).r),
material2.roughnessMap == -1 ? 1 : linearToSrgb(texture(textureArray, vec3(uv2, material2.roughnessMap)).r),
material3.roughnessMap == -1 ? 1 : linearToSrgb(texture(textureArray, vec3(uv3, material3.roughnessMap)).r)
float rough1, rough2, rough3;
LAYERED_SAMPLE_SCALAR(rough1, rough2, rough3,
material1.roughnessMap, material2.roughnessMap, material3.roughnessMap,
uv1, uv2, uv3,
hex1, hex2, hex3, 1.0,
linearToSrgb
);
vSpecularStrength *= vec3(rough1, rough2, rough3);

// apply specular highlights to anything semi-transparent
// this isn't always desirable but adds subtle light reflections to windows, etc.
Expand All @@ -371,10 +405,11 @@ void main() {
// ambient light
vec3 ambientLightOut = ambientColor * ambientStrength;

float aoFactor =
IN.texBlend.x * (material1.ambientOcclusionMap == -1 ? 1 : texture(textureArray, vec3(uv1, material1.ambientOcclusionMap)).r) +
IN.texBlend.y * (material2.ambientOcclusionMap == -1 ? 1 : texture(textureArray, vec3(uv2, material2.ambientOcclusionMap)).r) +
IN.texBlend.z * (material3.ambientOcclusionMap == -1 ? 1 : texture(textureArray, vec3(uv3, material3.ambientOcclusionMap)).r);
float ao1, ao2, ao3;
LAYERED_SAMPLE_SCALAR(ao1, ao2, ao3,
material1.ambientOcclusionMap, material2.ambientOcclusionMap, material3.ambientOcclusionMap,
uv1, uv2, uv3, hex1, hex2, hex3, 1.0, IDENTITY);
float aoFactor = IN.texBlend.x * ao1 + IN.texBlend.y * ao2 + IN.texBlend.z * ao3;
ambientLightOut *= aoFactor;

// directional light
Expand Down
12 changes: 11 additions & 1 deletion src/main/resources/rs117/hd/uniforms/materials.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ struct Material {
int ambientOcclusionMap;
int flowMap;
int shadowAlphaMap;
int flags; // overrideBaseColor << 2 | unlit << 1 | hasTransparency
int flags; // hexTilingMode (3 bits) << 3 | overrideBaseColor << 2 | unlit << 1 | hasTransparency
float brightness;
float displacementScale;
float specularStrength;
float specularGloss;
float hexTilingScale;
float hexTilingBlend;
float flowMapStrength;
vec2 flowMapDuration;
vec2 scrollDuration;
Expand All @@ -38,3 +40,11 @@ int getMaterialIsUnlit(const Material material) {
bool getMaterialHasTransparency(const Material material) {
return (material.flags & 1) == 1;
}

int getMaterialHexTilingMode(const Material material) {
return (material.flags >> 3) & 0x3;
}

bool isHexSamplingSame(const Material materialA, const Material materialB) {
return materialA.hexTilingScale == materialB.hexTilingScale && materialA.hexTilingBlend == materialB.hexTilingBlend && getMaterialHexTilingMode(materialA) == getMaterialHexTilingMode(materialB);
}
Loading