pq shaders and asset update

This commit is contained in:
RandomityGuy 2024-07-08 22:43:00 +05:30
parent b4b3906610
commit 00e4420100
58 changed files with 154 additions and 10 deletions

View file

@ -83,13 +83,6 @@ new SimGroup(MissionGroup) {
interiorFile = "~/data/multiplayer/interiors/PlatinumQuest/Marbleland.dif";
showTerrainInside = "0";
};
new InteriorInstance() {
position = "0 0 0";
rotation = "1 0 0 0";
scale = "1 1 1";
interiorFile = "~/data/multiplayer/interiors/PlatinumQuest/Marbleland2.dif";
showTerrainInside = "0";
};
new SimGroup(SpawnPointGroup) {
new Trigger() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -1,5 +1,6 @@
package src;
import shaders.PQMaterial;
import h3d.scene.MultiMaterial;
import shaders.NormalMaterial;
import shaders.NoiseTileMaterial;
@ -267,6 +268,23 @@ class DifBuilder {
worker.run();
}
static function createPQMaterial(onFinish:hxsl.Shader->Void, baseTexture:String, normalTexture:String, specularTexture:String, secondaryFactor:Float = 1) {
var worker = new ResourceLoaderWorker(() -> {
var diffuseTex = ResourceLoader.getTexture('data/multiplayer/interiors/platinumquest/${baseTexture}').resource;
var normalTex = ResourceLoader.getTexture('data/multiplayer/interiors/platinumquest/${normalTexture}').resource;
normalTex.wrap = Repeat;
var specularTex = ResourceLoader.getTexture('data/multiplayer/interiors/platinumquest/${specularTexture}').resource;
specularTex.wrap = Repeat;
var shader = new PQMaterial(diffuseTex, normalTex, 9.0, specularTex, MarbleGame.instance.world.ambient, MarbleGame.instance.world.dirLight,
MarbleGame.instance.world.dirLightDir, secondaryFactor);
onFinish(shader);
});
worker.loadFile('data/multiplayer/interiors/platinumquest/${baseTexture}');
worker.loadFile('data/multiplayer/interiors/platinumquest/${normalTexture}');
worker.loadFile('data/multiplayer/interiors/platinumquest/${specularTexture}');
worker.run();
}
static var shaderMaterialDict:Map<String, (hxsl.Shader->Void)->Void> = [
'interiors_mbu/plate_1' => (onFinish) -> createPhongMaterial(onFinish, 'plate.randomize.png', 'plate.normal.png', 8, new Vector(1, 1, 0.8, 1), 0.5),
'interiors_mbu/tile_beginner' => (onFinish) -> createNoiseTileMaterial(onFinish, 'tile_beginner.png', '', 40, new Vector(1, 1, 1, 1)),
@ -315,6 +333,52 @@ class DifBuilder {
new Vector(0.15, 0.15, 0.16, 1.0)),
'interiors_mbu/stripe_caution' => (onFinish) -> createPhongMaterial(onFinish, 'stripe_caution.png', 'DefaultNormal.png', 12,
new Vector(0.8, 0.8, 0.6, 1)),
'multiplayer/interiors/platinumquest/pq_hot_1_med' => (onFinish) -> createPQMaterial(onFinish, 'pq_hot_1_med.jpg', 'tile.normal.png', 'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_hot_2_light' => (onFinish) -> createPQMaterial(onFinish, 'pq_hot_2_light.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_hot_4_med' => (onFinish) -> createPQMaterial(onFinish, 'pq_hot_4_med.jpg', 'tile.normal.png', 'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_blue_med' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_blue_med.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_green_dark' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_green_dark.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_green_light' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_green_light.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_green_med' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_green_med.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_green_random' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_green_random.jpg', 'tile.normal.png',
'tile.spec.png', 0.25),
'multiplayer/interiors/platinumquest/pq_rays_red_light' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_red_light.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_purple_light' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_purple_light.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_rays_purple_med' => (onFinish) -> createPQMaterial(onFinish, 'pq_rays_purple_med.jpg', 'tile.normal.png',
'tile.spec.png'),
'multiplayer/interiors/platinumquest/pq_friction_ice' => (onFinish) -> createPQMaterial(onFinish, 'pq_friction_ice.jpg', 'ice.normal.png',
'DefaultSpec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_1' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_1.png', 'pq_ray_wall_1.normal.png',
'pq_ray_wall_1.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_2' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_2.png', 'pq_ray_wall_2.normal.png',
'pq_ray_wall_2.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_3' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_3.png', 'pq_ray_wall_3.normal.png',
'pq_ray_wall_3.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_4' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_4.png', 'pq_ray_wall_4.normal.png',
'pq_ray_wall_4.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_5' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_5.png', 'pq_ray_wall_5.normal.png',
'pq_ray_wall_5.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_6' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_6.png', 'pq_ray_wall_6.normal.png',
'pq_ray_wall_6.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_7' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_7.png', 'pq_ray_wall_7.normal.png',
'pq_ray_wall_7.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_8' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_8.png', 'pq_ray_wall_8.normal.png',
'pq_ray_wall_8.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_combo' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo.png',
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2_medium' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_small' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo.png',
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
];
public static function loadDif(path:String, itr:InteriorObject, onFinish:Void->Void, ?so:Int = -1) {

View file

@ -1,5 +1,6 @@
package src;
import shaders.PQMaterial;
import h3d.mat.Material;
import h3d.scene.MultiMaterial;
import shaders.EnvMap;
@ -263,6 +264,13 @@ class InstanceManager {
matclone.mainPass.addShader(nmapshdr);
// minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling;
}
var pqshdr = mat.mainPass.getShader(PQMaterial);
if (pqshdr != null) {
matclone.mainPass.removeShader(matclone.textureShader);
matclone.mainPass.addShader(pqshdr);
// minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling;
}
var cubemapshdr = mat.mainPass.getShader(EnvMap);
if (cubemapshdr != null) {
matclone.mainPass.addShader(cubemapshdr);

View file

@ -1139,15 +1139,15 @@ class Marble extends GameObject {
function updateRollSound(time:TimeState, contactPct:Float, slipAmount:Float) {
var rSpat = rollSound.getEffect(Spatialization);
rSpat.position = this.getAbsPos().getPosition();
rSpat.position = this.collider.transform.getPosition();
if (this.rollMegaSound != null) {
var rmspat = this.rollMegaSound.getEffect(Spatialization);
rmspat.position = this.getAbsPos().getPosition();
rmspat.position = this.collider.transform.getPosition();
}
var sSpat = slipSound.getEffect(Spatialization);
sSpat.position = this.getAbsPos().getPosition();
sSpat.position = this.collider.transform.getPosition();
var rollVel = bestContact != null ? this.velocity.sub(bestContact.velocity) : this.velocity;
var scale = rollVel.length();

79
src/shaders/PQMaterial.hx Normal file
View file

@ -0,0 +1,79 @@
package shaders;
class PQMaterial extends hxsl.Shader {
static var SRC = {
@param var diffuseMap:Sampler2D;
@param var normalMap:Sampler2D;
@param var shininess:Float;
@param var specularMap:Sampler2D;
@param var ambientLight:Vec3;
@param var dirLight:Vec3;
@param var dirLightDir:Vec3;
@param var secondaryUVMapFactor:Float;
@global var camera:{
var position:Vec3;
@var var dir:Vec3;
};
@global var global:{
@perObject var modelView:Mat4;
@perObject var modelViewInverse:Mat4;
};
@input var input:{
var normal:Vec3;
var tangent:Vec3;
var uv:Vec2;
};
var calculatedUV:Vec2;
var pixelColor:Vec4;
var specColor:Vec3;
var specPower:Float;
var transformedPosition:Vec3;
var transformedNormal:Vec3;
@var var transformedTangent:Vec4;
function __init__vertex() {
transformedTangent = vec4(input.tangent * global.modelView.mat3(), input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.);
}
function vertex() {
calculatedUV = input.uv;
}
function fragment() {
// Diffuse part
var diffuse = diffuseMap.get(calculatedUV);
var n = transformedNormal;
var nf = normalMap.get(calculatedUV * secondaryUVMapFactor) * 2.0 - 1.0;
var tanX = transformedTangent.xyz.normalize();
var tanY = n.cross(tanX) * transformedTangent.w;
transformedNormal = (nf.x * tanX + nf.y * tanY + nf.z * n).normalize();
var cosTheta = clamp(dot(transformedNormal, -dirLightDir), 0, 1);
var effectiveSun = dirLight * cosTheta + ambientLight;
effectiveSun = vec3(clamp(effectiveSun.r, 0, 1), clamp(effectiveSun.g, 0, 1), clamp(effectiveSun.b, 0, 1));
var outCol = vec4(diffuse.rgb * effectiveSun.rgb, 1);
var specularColor = specularMap.get(calculatedUV * secondaryUVMapFactor);
var eyeVec = (camera.position - transformedPosition).normalize();
var halfAng = (eyeVec - dirLightDir).normalize();
var specValue = saturate(transformedNormal.dot(halfAng));
var specular = specularColor * pow(specValue, shininess);
outCol.rgb += specular.rgb * dirLight;
outCol.a = 1;
pixelColor = outCol;
}
}
public function new(diffuse, normal, shininess, specularMap, ambientLight, dirLight, dirLightDir, secondaryFactor = 1.0) {
super();
this.diffuseMap = diffuse;
this.normalMap = normal;
this.shininess = shininess;
this.specularMap = specularMap;
this.ambientLight = ambientLight.clone();
this.dirLight = dirLight.clone();
this.dirLightDir = dirLightDir.clone();
this.secondaryUVMapFactor = secondaryFactor;
}
}