Patch_1
This commit is contained in:
@ -7,16 +7,20 @@ import kha.graphics4.TextureFilter;
|
||||
import kha.graphics4.MipMapFilter;
|
||||
import kha.arrays.Float32Array;
|
||||
import iron.math.Vec4;
|
||||
import iron.math.Mat4;
|
||||
import iron.math.Quat;
|
||||
import iron.math.Mat3;
|
||||
import iron.math.Mat4;
|
||||
import iron.data.WorldData;
|
||||
import iron.data.MaterialData;
|
||||
import iron.data.ShaderData;
|
||||
import iron.data.SceneFormat;
|
||||
import iron.data.WorldData;
|
||||
import iron.data.SceneFormat.TShaderConstant;
|
||||
import iron.data.SceneFormat.TBindConstant;
|
||||
import iron.object.Transform;
|
||||
import iron.object.LightObject;
|
||||
import iron.Scene;
|
||||
import iron.RenderPath;
|
||||
import iron.system.Input;
|
||||
import iron.system.Time;
|
||||
import iron.RenderPath;
|
||||
using StringTools;
|
||||
|
||||
// Structure for setting shader uniforms
|
||||
@ -38,6 +42,7 @@ class Uniforms {
|
||||
public static var helpMat = Mat4.identity();
|
||||
public static var helpMat2 = Mat4.identity();
|
||||
public static var helpMat3 = Mat3.identity();
|
||||
public static var helpMat4 = Mat4.identity();
|
||||
public static var helpVec = new Vec4();
|
||||
public static var helpVec2 = new Vec4();
|
||||
public static var helpQuat = new Quat(); // Keep at identity
|
||||
@ -47,6 +52,10 @@ class Uniforms {
|
||||
public static var externalVec4Links: Array<Object->MaterialData->String->Vec4> = null;
|
||||
public static var externalVec3Links: Array<Object->MaterialData->String->Vec4> = null;
|
||||
public static var externalVec2Links: Array<Object->MaterialData->String->Vec4> = null;
|
||||
|
||||
public static var eyeLeftCallCount = 0;
|
||||
public static var lastFrameChecked = -1;
|
||||
|
||||
public static var externalFloatLinks: Array<Object->MaterialData->String->Null<kha.FastFloat>> = null;
|
||||
public static var externalFloatsLinks: Array<Object->MaterialData->String->Float32Array> = null;
|
||||
public static var externalIntLinks: Array<Object->MaterialData->String->Null<Int>> = null;
|
||||
@ -59,6 +68,10 @@ class Uniforms {
|
||||
public static var defaultFilter = TextureFilter.LinearFilter;
|
||||
#end
|
||||
|
||||
#if lnx_morph_target
|
||||
public static var forceUploadMorphWeights: Bool = false;
|
||||
#end
|
||||
|
||||
public static function setContextConstants(g: Graphics, context: ShaderContext, bindParams: Array<String>) {
|
||||
if (context.raw.constants != null) {
|
||||
for (i in 0...context.raw.constants.length) {
|
||||
@ -181,11 +194,15 @@ class Uniforms {
|
||||
// Multiple voxel volumes, always set params
|
||||
g.setImageTexture(context.textureUnits[j], rt.image); // image2D/3D
|
||||
if (rt.raw.name.startsWith("voxels_")) {
|
||||
g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter);
|
||||
g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.LinearMipFilter);
|
||||
}
|
||||
else if (rt.raw.name.startsWith("voxelsSDF"))
|
||||
{
|
||||
g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.PointFilter, TextureFilter.PointFilter, MipMapFilter.NoMipFilter);
|
||||
}
|
||||
else if (rt.raw.name.startsWith("voxels"))
|
||||
{
|
||||
g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter);
|
||||
g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.PointMipFilter);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -286,6 +303,89 @@ class Uniforms {
|
||||
helpMat.getInverse(helpMat);
|
||||
m = helpMat;
|
||||
}
|
||||
#if lnx_vr
|
||||
case "_inverseViewProjectionMatrixLeft": {
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var leftView = vr.GetViewMatrix(0);
|
||||
var leftProj = vr.GetProjectionMatrix(0);
|
||||
helpMat._00 = leftView._00; helpMat._01 = leftView._01; helpMat._02 = leftView._02; helpMat._03 = leftView._03;
|
||||
helpMat._10 = leftView._10; helpMat._11 = leftView._11; helpMat._12 = leftView._12; helpMat._13 = leftView._13;
|
||||
helpMat._20 = leftView._20; helpMat._21 = leftView._21; helpMat._22 = leftView._22; helpMat._23 = leftView._23;
|
||||
helpMat._30 = leftView._30; helpMat._31 = leftView._31; helpMat._32 = leftView._32; helpMat._33 = leftView._33;
|
||||
helpMat2._00 = leftProj._00; helpMat2._01 = leftProj._01; helpMat2._02 = leftProj._02; helpMat2._03 = leftProj._03;
|
||||
helpMat2._10 = leftProj._10; helpMat2._11 = leftProj._11; helpMat2._12 = leftProj._12; helpMat2._13 = leftProj._13;
|
||||
helpMat2._20 = leftProj._20; helpMat2._21 = leftProj._21; helpMat2._22 = leftProj._22; helpMat2._23 = leftProj._23;
|
||||
helpMat2._30 = leftProj._30; helpMat2._31 = leftProj._31; helpMat2._32 = leftProj._32; helpMat2._33 = leftProj._33;
|
||||
helpMat.multmat(helpMat2);
|
||||
helpMat.getInverse(helpMat);
|
||||
} else if (iron.RenderPath.isVRSimulateMode()) {
|
||||
var ipd_offset = 0.032 * 35.0; // Match eye offset
|
||||
var rightVec = camera.rightWorld();
|
||||
|
||||
var eyeLeftX = camera.transform.worldx() - rightVec.x * ipd_offset;
|
||||
var eyeLeftY = camera.transform.worldy() - rightVec.y * ipd_offset;
|
||||
var eyeLeftZ = camera.transform.worldz() - rightVec.z * ipd_offset;
|
||||
|
||||
helpMat.setFrom(camera.transform.world);
|
||||
helpMat._30 = eyeLeftX;
|
||||
helpMat._31 = eyeLeftY;
|
||||
helpMat._32 = eyeLeftZ;
|
||||
helpMat.getInverse(helpMat); // Now it's a view matrix
|
||||
|
||||
helpMat.multmat(camera.P);
|
||||
helpMat.getInverse(helpMat);
|
||||
} else {
|
||||
helpMat.setFrom(camera.V);
|
||||
helpMat.multmat(camera.P);
|
||||
helpMat.getInverse(helpMat);
|
||||
}
|
||||
m = helpMat;
|
||||
}
|
||||
case "_inverseViewProjectionMatrixRight": {
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var rightView = vr.GetViewMatrix(1);
|
||||
var rightProj = vr.GetProjectionMatrix(1);
|
||||
// kha.math.FastMatrix4 to iron.math.Mat4
|
||||
helpMat2._00 = rightView._00; helpMat2._01 = rightView._01; helpMat2._02 = rightView._02; helpMat2._03 = rightView._03;
|
||||
helpMat2._10 = rightView._10; helpMat2._11 = rightView._11; helpMat2._12 = rightView._12; helpMat2._13 = rightView._13;
|
||||
helpMat2._20 = rightView._20; helpMat2._21 = rightView._21; helpMat2._22 = rightView._22; helpMat2._23 = rightView._23;
|
||||
helpMat2._30 = rightView._30; helpMat2._31 = rightView._31; helpMat2._32 = rightView._32; helpMat2._33 = rightView._33;
|
||||
helpMat4._00 = rightProj._00; helpMat4._01 = rightProj._01; helpMat4._02 = rightProj._02; helpMat4._03 = rightProj._03;
|
||||
helpMat4._10 = rightProj._10; helpMat4._11 = rightProj._11; helpMat4._12 = rightProj._12; helpMat4._13 = rightProj._13;
|
||||
helpMat4._20 = rightProj._20; helpMat4._21 = rightProj._21; helpMat4._22 = rightProj._22; helpMat4._23 = rightProj._23;
|
||||
helpMat4._30 = rightProj._30; helpMat4._31 = rightProj._31; helpMat4._32 = rightProj._32; helpMat4._33 = rightProj._33;
|
||||
helpMat2.multmat(helpMat4);
|
||||
helpMat2.getInverse(helpMat2);
|
||||
m = helpMat2;
|
||||
} else if (iron.RenderPath.isVRSimulateMode()) {
|
||||
var ipd_offset = 0.032 * 35.0;
|
||||
var rightVec = camera.rightWorld();
|
||||
|
||||
// calculate right eye position in world space
|
||||
var eyeRightX = camera.transform.worldx() + rightVec.x * ipd_offset;
|
||||
var eyeRightY = camera.transform.worldy() + rightVec.y * ipd_offset;
|
||||
var eyeRightZ = camera.transform.worldz() + rightVec.z * ipd_offset;
|
||||
|
||||
helpMat2.setFrom(camera.transform.world);
|
||||
helpMat2._30 = eyeRightX;
|
||||
helpMat2._31 = eyeRightY;
|
||||
helpMat2._32 = eyeRightZ;
|
||||
helpMat2.getInverse(helpMat2);
|
||||
|
||||
helpMat2.multmat(camera.P);
|
||||
helpMat2.getInverse(helpMat2);
|
||||
m = helpMat2;
|
||||
} else {
|
||||
// fallback to center camera
|
||||
helpMat2.setFrom(camera.V);
|
||||
helpMat2.multmat(camera.P);
|
||||
helpMat2.getInverse(helpMat2);
|
||||
m = helpMat2;
|
||||
}
|
||||
}
|
||||
#end
|
||||
case "_viewProjectionMatrix": {
|
||||
#if lnx_centerworld
|
||||
m = vmat(camera.V);
|
||||
@ -398,6 +498,28 @@ class Uniforms {
|
||||
v = helpVec;
|
||||
}
|
||||
}
|
||||
#if lnx_vr
|
||||
case "_pointPositionLeft": {
|
||||
var point = RenderPath.active.point;
|
||||
if (point != null) {
|
||||
var lightWorldX = point.transform.worldx();
|
||||
var lightWorldY = point.transform.worldy();
|
||||
var lightWorldZ = point.transform.worldz();
|
||||
helpVec.set(lightWorldX, lightWorldY, lightWorldZ);
|
||||
v = helpVec;
|
||||
}
|
||||
}
|
||||
case "_pointPositionRight": {
|
||||
var point = RenderPath.active.point;
|
||||
if (point != null) {
|
||||
var lightWorldX = point.transform.worldx();
|
||||
var lightWorldY = point.transform.worldy();
|
||||
var lightWorldZ = point.transform.worldz();
|
||||
helpVec.set(lightWorldX, lightWorldY, lightWorldZ);
|
||||
v = helpVec;
|
||||
}
|
||||
}
|
||||
#end
|
||||
#if lnx_spot
|
||||
case "_spotDirection": {
|
||||
var point = RenderPath.active.point;
|
||||
@ -484,6 +606,84 @@ class Uniforms {
|
||||
helpVec = camera.rightWorld().normalize();
|
||||
v = helpVec;
|
||||
}
|
||||
#if lnx_vr
|
||||
case "_eyeLeft": {
|
||||
var currentFrame = iron.RenderPath.active.frame;
|
||||
if (currentFrame != lastFrameChecked) {
|
||||
eyeLeftCallCount = 0;
|
||||
lastFrameChecked = currentFrame;
|
||||
}
|
||||
eyeLeftCallCount++;
|
||||
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var leftViewMatrix = vr.GetViewMatrix(0);
|
||||
var invLeft = leftViewMatrix.inverse();
|
||||
helpVec.set(invLeft._30, invLeft._31, invLeft._32);
|
||||
// trace("eyeLeft: " + helpVec.x + ", " + helpVec.y + ", " + helpVec.z);
|
||||
} else if (iron.RenderPath.isVRSimulateMode()) {
|
||||
var ipd_offset = 0.032 * 35.0;
|
||||
var rightVec = camera.rightWorld();
|
||||
var centerX = camera.transform.worldx();
|
||||
var centerY = camera.transform.worldy();
|
||||
var centerZ = camera.transform.worldz();
|
||||
helpVec.set(
|
||||
centerX - rightVec.x * ipd_offset,
|
||||
centerY - rightVec.y * ipd_offset,
|
||||
centerZ - rightVec.z * ipd_offset
|
||||
);
|
||||
} else {
|
||||
helpVec.set(camera.transform.worldx(), camera.transform.worldy(), camera.transform.worldz());
|
||||
}
|
||||
v = helpVec;
|
||||
}
|
||||
case "_eyeRight": {
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var rightViewMatrix = vr.GetViewMatrix(1);
|
||||
var invRight = rightViewMatrix.inverse();
|
||||
helpVec.set(invRight._30, invRight._31, invRight._32);
|
||||
} else if (iron.RenderPath.isVRSimulateMode()) {
|
||||
var ipd_offset = 0.032 * 35.0;
|
||||
var rightVec = camera.rightWorld();
|
||||
var centerX = camera.transform.worldx();
|
||||
var centerY = camera.transform.worldy();
|
||||
var centerZ = camera.transform.worldz();
|
||||
helpVec.set(
|
||||
centerX + rightVec.x * ipd_offset,
|
||||
centerY + rightVec.y * ipd_offset,
|
||||
centerZ + rightVec.z * ipd_offset
|
||||
);
|
||||
} else {
|
||||
helpVec.set(camera.transform.worldx(), camera.transform.worldy(), camera.transform.worldz());
|
||||
}
|
||||
v = helpVec;
|
||||
}
|
||||
case "_eyeLookLeft": {
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var leftViewMatrix = vr.GetViewMatrix(0);
|
||||
var invLeft = leftViewMatrix.inverse();
|
||||
helpVec.set(-invLeft._20, -invLeft._21, -invLeft._22);
|
||||
helpVec.normalize();
|
||||
} else {
|
||||
helpVec = camera.lookWorld().normalize();
|
||||
}
|
||||
v = helpVec;
|
||||
}
|
||||
case "_eyeLookRight": {
|
||||
var vr = kha.vr.VrInterface.instance;
|
||||
if (vr != null && vr.IsPresenting()) {
|
||||
var rightViewMatrix = vr.GetViewMatrix(1);
|
||||
var invRight = rightViewMatrix.inverse();
|
||||
helpVec.set(-invRight._20, -invRight._21, -invRight._22);
|
||||
helpVec.normalize();
|
||||
} else {
|
||||
helpVec = camera.lookWorld().normalize();
|
||||
}
|
||||
v = helpVec;
|
||||
}
|
||||
#end
|
||||
case "_backgroundCol": {
|
||||
if (camera.data.raw.clear_color != null) helpVec.set(camera.data.raw.clear_color[0], camera.data.raw.clear_color[1], camera.data.raw.clear_color[2]);
|
||||
v = helpVec;
|
||||
@ -1161,7 +1361,19 @@ class Uniforms {
|
||||
#end // lnx_clusters
|
||||
#if lnx_morph_target
|
||||
case "_morphWeights": {
|
||||
fa = cast(object, MeshObject).morphTarget.morphWeights;
|
||||
var morphTarget = cast(object, MeshObject).morphTarget;
|
||||
morphTarget.flushBatchedUpdates();
|
||||
if (forceUploadMorphWeights) {
|
||||
fa = morphTarget.morphWeights;
|
||||
}
|
||||
else {
|
||||
if (morphTarget.isDirty) {
|
||||
fa = morphTarget.morphWeights;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#end
|
||||
}
|
||||
@ -1175,6 +1387,12 @@ class Uniforms {
|
||||
|
||||
if (fa == null) return;
|
||||
g.setFloats(location, fa);
|
||||
|
||||
#if lnx_morph_target
|
||||
if (c.link == "_morphWeights") {
|
||||
cast(object, MeshObject).morphTarget.markClean();
|
||||
}
|
||||
#end
|
||||
}
|
||||
else if (c.type == "int") {
|
||||
var i: Null<Int> = null;
|
||||
@ -1203,6 +1421,7 @@ class Uniforms {
|
||||
if (materialContext.raw.bind_constants != null) {
|
||||
for (i in 0...materialContext.raw.bind_constants.length) {
|
||||
var matc = materialContext.raw.bind_constants[i];
|
||||
if (matc == null) continue;
|
||||
var pos = -1;
|
||||
for (i in 0...context.raw.constants.length) {
|
||||
if (context.raw.constants[i].name == matc.name) {
|
||||
|
||||
Reference in New Issue
Block a user