pq shaders and asset update
|
|
@ -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() {
|
||||
|
|
|
|||
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;
|
||||
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||