2016-10-15 15:08:25 +02:00
|
|
|
package armory.object;
|
|
|
|
|
|
|
|
import iron.Scene;
|
|
|
|
import iron.math.Vec4;
|
|
|
|
|
2016-10-15 20:19:09 +02:00
|
|
|
// Structure for setting shader uniforms
|
2016-10-15 15:08:25 +02:00
|
|
|
class Uniforms {
|
|
|
|
|
|
|
|
public static function register() {
|
2018-06-12 11:49:41 +02:00
|
|
|
iron.object.Uniforms.externalTextureLinks = [textureLink];
|
|
|
|
iron.object.Uniforms.externalVec3Links = [vec3Link];
|
|
|
|
iron.object.Uniforms.externalFloatLinks = [floatLink];
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
|
|
|
|
2018-06-12 11:49:41 +02:00
|
|
|
public static function textureLink(link:String):kha.Image {
|
|
|
|
if (link == "_smaaSearch") {
|
2016-10-15 15:08:25 +02:00
|
|
|
return Scene.active.embedded.get('smaa_search.png');
|
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_smaaArea") {
|
2016-10-15 15:08:25 +02:00
|
|
|
return Scene.active.embedded.get('smaa_area.png');
|
|
|
|
}
|
2017-11-27 14:29:21 +01:00
|
|
|
#if arm_ltc
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_ltcMat") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.data.ConstData.ltcMatTex == null) armory.data.ConstData.initLTC();
|
|
|
|
return armory.data.ConstData.ltcMatTex;
|
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_ltcMag") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.data.ConstData.ltcMagTex == null) armory.data.ConstData.initLTC();
|
|
|
|
return armory.data.ConstData.ltcMagTex;
|
|
|
|
}
|
2017-11-27 14:29:21 +01:00
|
|
|
#end
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_lensTexture") {
|
2017-10-13 15:21:36 +02:00
|
|
|
return Scene.active.embedded.get('lenstexture.jpg');
|
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_lutTexture") {
|
2017-12-07 17:09:44 +01:00
|
|
|
return Scene.active.embedded.get('luttexture.jpg');
|
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_cloudsTexture") {
|
2017-10-13 15:21:36 +02:00
|
|
|
return Scene.active.embedded.get('cloudstexture.png');
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-06-12 11:49:41 +02:00
|
|
|
public static function vec3Link(link:String):iron.math.Vec4 {
|
2016-10-15 15:08:25 +02:00
|
|
|
var v:Vec4 = null;
|
2017-11-27 14:29:21 +01:00
|
|
|
#if arm_hosek
|
2018-06-12 11:49:41 +02:00
|
|
|
if (link == "_hosekA") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.A.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.A.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.A.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekB") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.B.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.B.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.B.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekC") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.C.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.C.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.C.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekD") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.D.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.D.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.D.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekE") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.E.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.E.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.E.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekF") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.F.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.F.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.F.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekG") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.G.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.G.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.G.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekH") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.H.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.H.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.H.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekI") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.I.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.I.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.I.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_hosekZ") {
|
2016-10-15 15:08:25 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data == null) {
|
|
|
|
armory.renderpath.HosekWilkie.init(Scene.active.world);
|
|
|
|
}
|
2018-03-27 22:28:45 +02:00
|
|
|
if (armory.renderpath.HosekWilkie.data != null) {
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
v.x = armory.renderpath.HosekWilkie.data.Z.x;
|
|
|
|
v.y = armory.renderpath.HosekWilkie.data.Z.y;
|
|
|
|
v.z = armory.renderpath.HosekWilkie.data.Z.z;
|
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|
2018-06-12 11:49:41 +02:00
|
|
|
else if (link == "_cameraPositionSnap") {
|
2018-02-25 19:01:22 +01:00
|
|
|
#if arm_voxelgi
|
|
|
|
v = iron.object.Uniforms.helpVec;
|
|
|
|
var camera = iron.Scene.active.camera;
|
|
|
|
v.set(camera.transform.worldx(), camera.transform.worldy(), camera.transform.worldz());
|
|
|
|
var l = camera.lookWorld();
|
|
|
|
var e = Main.voxelgiHalfExtents;
|
|
|
|
v.x += l.x * e * 0.9;
|
|
|
|
v.y += l.y * e * 0.9;
|
|
|
|
var f = Main.voxelgiVoxelSize * 8; // Snaps to 3 mip-maps range
|
|
|
|
v.set(Math.floor(v.x / f) * f, Math.floor(v.y / f) * f, Math.floor(v.z / f) * f);
|
|
|
|
#end
|
|
|
|
}
|
2017-11-27 14:29:21 +01:00
|
|
|
#end
|
2016-10-15 15:08:25 +02:00
|
|
|
return v;
|
|
|
|
}
|
2016-10-19 17:46:13 +02:00
|
|
|
|
2018-06-12 11:49:41 +02:00
|
|
|
public static function floatLink(link:String):Null<kha.FastFloat> {
|
2018-03-04 19:38:40 +01:00
|
|
|
#if rp_dynres
|
2018-06-12 11:49:41 +02:00
|
|
|
if (link == "_dynamicScale") {
|
2016-10-19 17:46:13 +02:00
|
|
|
return armory.renderpath.DynamicResolutionScale.dynamicScale;
|
|
|
|
}
|
2018-03-04 19:38:40 +01:00
|
|
|
#end
|
2018-06-12 11:49:41 +02:00
|
|
|
return null;
|
2016-10-19 17:46:13 +02:00
|
|
|
}
|
2016-10-15 15:08:25 +02:00
|
|
|
}
|