pq shaders and asset update
|
|
@ -83,13 +83,6 @@ new SimGroup(MissionGroup) {
|
||||||
interiorFile = "~/data/multiplayer/interiors/PlatinumQuest/Marbleland.dif";
|
interiorFile = "~/data/multiplayer/interiors/PlatinumQuest/Marbleland.dif";
|
||||||
showTerrainInside = "0";
|
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 SimGroup(SpawnPointGroup) {
|
||||||
|
|
||||||
new Trigger() {
|
new Trigger() {
|
||||||
|
|
|
||||||
BIN
data/multiplayer/interiors/PlatinumQuest/DefaultSpec.png
Normal file
|
After Width: | Height: | Size: 113 B |
BIN
data/multiplayer/interiors/PlatinumQuest/ice.normal.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 41 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_1.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_1.spec.png
Normal file
|
After Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 52 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_2.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_2.spec.png
Normal file
|
After Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 34 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_3.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_3.spec.png
Normal file
|
After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 30 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_4.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_4.spec.png
Normal file
|
After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 45 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_5.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_5.spec.png
Normal file
|
After Width: | Height: | Size: 294 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 50 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_6.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_6.spec.png
Normal file
|
After Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 43 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_7.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_7.spec.png
Normal file
|
After Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 42 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_8.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_8.spec.png
Normal file
|
After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 90 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_combo.png
Normal file
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
Before Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 96 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/pq_ray_wall_combo_2.png
Normal file
|
After Width: | Height: | Size: 232 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 103 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/tile.normal.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
data/multiplayer/interiors/PlatinumQuest/tile.spec.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -1,5 +1,6 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import shaders.PQMaterial;
|
||||||
import h3d.scene.MultiMaterial;
|
import h3d.scene.MultiMaterial;
|
||||||
import shaders.NormalMaterial;
|
import shaders.NormalMaterial;
|
||||||
import shaders.NoiseTileMaterial;
|
import shaders.NoiseTileMaterial;
|
||||||
|
|
@ -267,6 +268,23 @@ class DifBuilder {
|
||||||
worker.run();
|
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> = [
|
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/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)),
|
'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)),
|
new Vector(0.15, 0.15, 0.16, 1.0)),
|
||||||
'interiors_mbu/stripe_caution' => (onFinish) -> createPhongMaterial(onFinish, 'stripe_caution.png', 'DefaultNormal.png', 12,
|
'interiors_mbu/stripe_caution' => (onFinish) -> createPhongMaterial(onFinish, 'stripe_caution.png', 'DefaultNormal.png', 12,
|
||||||
new Vector(0.8, 0.8, 0.6, 1)),
|
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) {
|
public static function loadDif(path:String, itr:InteriorObject, onFinish:Void->Void, ?so:Int = -1) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import shaders.PQMaterial;
|
||||||
import h3d.mat.Material;
|
import h3d.mat.Material;
|
||||||
import h3d.scene.MultiMaterial;
|
import h3d.scene.MultiMaterial;
|
||||||
import shaders.EnvMap;
|
import shaders.EnvMap;
|
||||||
|
|
@ -263,6 +264,13 @@ class InstanceManager {
|
||||||
matclone.mainPass.addShader(nmapshdr);
|
matclone.mainPass.addShader(nmapshdr);
|
||||||
// minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling;
|
// 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);
|
var cubemapshdr = mat.mainPass.getShader(EnvMap);
|
||||||
if (cubemapshdr != null) {
|
if (cubemapshdr != null) {
|
||||||
matclone.mainPass.addShader(cubemapshdr);
|
matclone.mainPass.addShader(cubemapshdr);
|
||||||
|
|
|
||||||
|
|
@ -1139,15 +1139,15 @@ class Marble extends GameObject {
|
||||||
|
|
||||||
function updateRollSound(time:TimeState, contactPct:Float, slipAmount:Float) {
|
function updateRollSound(time:TimeState, contactPct:Float, slipAmount:Float) {
|
||||||
var rSpat = rollSound.getEffect(Spatialization);
|
var rSpat = rollSound.getEffect(Spatialization);
|
||||||
rSpat.position = this.getAbsPos().getPosition();
|
rSpat.position = this.collider.transform.getPosition();
|
||||||
|
|
||||||
if (this.rollMegaSound != null) {
|
if (this.rollMegaSound != null) {
|
||||||
var rmspat = this.rollMegaSound.getEffect(Spatialization);
|
var rmspat = this.rollMegaSound.getEffect(Spatialization);
|
||||||
rmspat.position = this.getAbsPos().getPosition();
|
rmspat.position = this.collider.transform.getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
var sSpat = slipSound.getEffect(Spatialization);
|
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 rollVel = bestContact != null ? this.velocity.sub(bestContact.velocity) : this.velocity;
|
||||||
var scale = rollVel.length();
|
var scale = rollVel.length();
|
||||||
|
|
|
||||||
79
src/shaders/PQMaterial.hx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||