From 9f84ba8ad0db42939b551acfdb292c25b6b24e8e Mon Sep 17 00:00:00 2001 From: dexy Date: Sun, 3 Nov 2019 06:25:20 +1100 Subject: [PATCH] Added vertex shaders for skin mesh support --- .../GameFiles/Resources/Drawable.cs | 3 +- Rendering/Renderable.cs | 48 +++++-- Rendering/Shaders/BasicShader.cs | 132 +++++++++++++----- Rendering/Utils/GpuBuffers.cs | 48 +++++++ Shaders/BasicVS.hlsli | 34 ++++- Shaders/BasicVS_PBBNCCT.cso | Bin 0 -> 11180 bytes Shaders/BasicVS_PBBNCCT.hlsl | 46 ++++++ Shaders/BasicVS_PBBNCCTX.cso | Bin 0 -> 11812 bytes Shaders/BasicVS_PBBNCCTX.hlsl | 49 +++++++ Shaders/BasicVS_PBBNCT.cso | Bin 0 -> 11148 bytes Shaders/BasicVS_PBBNCT.hlsl | 45 ++++++ Shaders/BasicVS_PBBNCTT.cso | Bin 0 -> 11172 bytes Shaders/BasicVS_PBBNCTT.hlsl | 46 ++++++ Shaders/BasicVS_PBBNCTTT.cso | Bin 0 -> 11196 bytes Shaders/BasicVS_PBBNCTTT.hlsl | 47 +++++++ Shaders/BasicVS_PBBNCTTX.cso | Bin 0 -> 11804 bytes Shaders/BasicVS_PBBNCTTX.hlsl | 47 +++++++ Shaders/BasicVS_PBBNCTX.cso | Bin 0 -> 11780 bytes Shaders/BasicVS_PBBNCTX.hlsl | 47 +++++++ Shaders/BasicVS_PNCTTT.cso | Bin 0 -> 10136 bytes Shaders/BasicVS_PNCTTT.hlsl | 41 ++++++ Shaders/CodeWalkerShaders.vcxproj | 80 +++++++++++ Shaders/CodeWalkerShaders.vcxproj.filters | 8 ++ 23 files changed, 674 insertions(+), 47 deletions(-) create mode 100644 Shaders/BasicVS_PBBNCCT.cso create mode 100644 Shaders/BasicVS_PBBNCCT.hlsl create mode 100644 Shaders/BasicVS_PBBNCCTX.cso create mode 100644 Shaders/BasicVS_PBBNCCTX.hlsl create mode 100644 Shaders/BasicVS_PBBNCT.cso create mode 100644 Shaders/BasicVS_PBBNCT.hlsl create mode 100644 Shaders/BasicVS_PBBNCTT.cso create mode 100644 Shaders/BasicVS_PBBNCTT.hlsl create mode 100644 Shaders/BasicVS_PBBNCTTT.cso create mode 100644 Shaders/BasicVS_PBBNCTTT.hlsl create mode 100644 Shaders/BasicVS_PBBNCTTX.cso create mode 100644 Shaders/BasicVS_PBBNCTTX.hlsl create mode 100644 Shaders/BasicVS_PBBNCTX.cso create mode 100644 Shaders/BasicVS_PBBNCTX.hlsl create mode 100644 Shaders/BasicVS_PNCTTT.cso create mode 100644 Shaders/BasicVS_PNCTTT.hlsl diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index 47de0f7..11ebd0e 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -802,7 +802,7 @@ namespace CodeWalker.GameFiles //used by CW for animating skeletons. public Quaternion AnimRotation; public Vector3 AnimTranslation; - + public Matrix AnimTransform; /// @@ -844,6 +844,7 @@ namespace CodeWalker.GameFiles AnimRotation = Rotation; AnimTranslation = Translation; + AnimTransform = Matrix.AffineTransformation(1.0f, AnimRotation, AnimTranslation); } /// diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index 4ad78da..6952040 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -77,6 +77,8 @@ namespace CodeWalker.Rendering public ClipMapEntry ClipMapEntry; public Dictionary ModelBoneLinks; + public Matrix3_s[] BoneTransforms; + public override void Init(DrawableBase drawable) { @@ -297,6 +299,28 @@ namespace CodeWalker.Rendering } } } + + + + + + //populate the bonetransforms array + Matrix[] bonetrans = (fragtransforms != null) ? fragtransforms : (modeltransforms != null) ? modeltransforms : null; + if (bonetrans != null) + { + BoneTransforms = new Matrix3_s[bonetrans.Length]; + for (int i = 0; i < bonetrans.Length; i++) + { + Matrix b = bonetrans[i]; + Matrix3_s bt = new Matrix3_s(); + bt.Row1 = b.Row1; + bt.Row2 = b.Row2; + bt.Row3 = b.Row3; + BoneTransforms[i] = bt; + } + } + + } private RenderableModel InitModel(DrawableModel dm) @@ -445,17 +469,6 @@ namespace CodeWalker.Rendering for (int i = 0; i < bones.Count; i++) { var bone = bones[i]; - - RenderableModel bmodel = null; - ModelBoneLinks?.TryGetValue(bone.Id, out bmodel); - if (bmodel == null) - { continue; } - - if (((bmodel.SkeletonBinding >> 8) & 0xFF) > 0) //skin mesh? //TODO: see eg. p_oil_pjack_03_s - { continue; } - - //update model's transform from animated bone - var pos = bone.AnimTranslation; var ori = bone.AnimRotation; var pbone = bone.Parent; @@ -465,8 +478,19 @@ namespace CodeWalker.Rendering ori = pbone.AnimRotation * ori; pbone = pbone.Parent; } + bone.AnimTransform = Matrix.AffineTransformation(1.0f, ori, pos); - bmodel.Transform = Matrix.AffineTransformation(1.0f, ori, pos); + + //update model's transform from animated bone + RenderableModel bmodel = null; + ModelBoneLinks?.TryGetValue(bone.Id, out bmodel); + if (bmodel == null) + { continue; } + + if (((bmodel.SkeletonBinding >> 8) & 0xFF) > 0) //skin mesh? //TODO: see eg. p_oil_pjack_03_s + { continue; } + + bmodel.Transform = bone.AnimTransform; } diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index e35f96f..9e9bbc4 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -122,6 +122,7 @@ namespace CodeWalker.Rendering VertexShader basicvspnct; VertexShader basicvspnctt; + VertexShader basicvspncttt; VertexShader basicvspncct; VertexShader basicvspncctt; VertexShader basicvspnccttt; @@ -131,6 +132,13 @@ namespace CodeWalker.Rendering VertexShader basicvspnccttx; VertexShader basicvspnctttx; VertexShader basicvspncctttx; + VertexShader basicvspbbnct; + VertexShader basicvspbbnctx; + VertexShader basicvspbbnctt; + VertexShader basicvspbbncttt; + VertexShader basicvspbbncct; + VertexShader basicvspbbncctx; + VertexShader basicvspbbncttx; VertexShader basicvsbox; VertexShader basicvssphere; VertexShader basicvscapsule; @@ -144,6 +152,7 @@ namespace CodeWalker.Rendering GpuVarsBuffer PSGeomVars; GpuVarsBuffer InstGlobalVars; GpuVarsBuffer InstLocalVars; + GpuABuffer BoneMatrices; SamplerState texsampler; SamplerState texsampleranis; SamplerState texsamplertnt; @@ -172,6 +181,7 @@ namespace CodeWalker.Rendering { byte[] vspnctbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCT.cso"); byte[] vspncttbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCTT.cso"); + byte[] vspnctttbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCTTT.cso"); byte[] vspncctbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCCT.cso"); byte[] vspnccttbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCCTT.cso"); byte[] vspncctttbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCCTTT.cso"); @@ -181,6 +191,15 @@ namespace CodeWalker.Rendering byte[] vspnccttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCCTTX.cso"); byte[] vspnctttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCTTTX.cso"); byte[] vspncctttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PNCCTTTX.cso"); + + byte[] vspbbnctbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCT.cso"); + byte[] vspbbnctxbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCTX.cso"); + byte[] vspbbncttbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCTT.cso"); + byte[] vspbbnctttbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCTTT.cso"); + byte[] vspbbncctbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCCT.cso"); + byte[] vspbbncctxbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCCTX.cso"); + byte[] vspbbncttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCTTX.cso"); + byte[] vsboxbytes = File.ReadAllBytes("Shaders\\BasicVS_Box.cso"); byte[] vsspherebytes = File.ReadAllBytes("Shaders\\BasicVS_Sphere.cso"); byte[] vscapsulebytes = File.ReadAllBytes("Shaders\\BasicVS_Capsule.cso"); @@ -189,6 +208,7 @@ namespace CodeWalker.Rendering basicvspnct = new VertexShader(device, vspnctbytes); basicvspnctt = new VertexShader(device, vspncttbytes); + basicvspncttt = new VertexShader(device, vspnctttbytes); basicvspncct = new VertexShader(device, vspncctbytes); basicvspncctt = new VertexShader(device, vspnccttbytes); basicvspnccttt = new VertexShader(device, vspncctttbytes); @@ -198,6 +218,13 @@ namespace CodeWalker.Rendering basicvspnccttx = new VertexShader(device, vspnccttxbytes); basicvspnctttx = new VertexShader(device, vspnctttxbytes); basicvspncctttx = new VertexShader(device, vspncctttxbytes); + basicvspbbnct = new VertexShader(device, vspbbnctbytes); + basicvspbbnctx = new VertexShader(device, vspbbnctxbytes); + basicvspbbnctt = new VertexShader(device, vspbbncttbytes); + basicvspbbncttt = new VertexShader(device, vspbbnctttbytes); + basicvspbbncct = new VertexShader(device, vspbbncctbytes); + basicvspbbncctx = new VertexShader(device, vspbbncctxbytes); + basicvspbbncttx = new VertexShader(device, vspbbncttxbytes); basicvsbox = new VertexShader(device, vsboxbytes); basicvssphere = new VertexShader(device, vsspherebytes); basicvscapsule = new VertexShader(device, vscapsulebytes); @@ -212,49 +239,47 @@ namespace CodeWalker.Rendering PSGeomVars = new GpuVarsBuffer(device); InstGlobalVars = new GpuVarsBuffer(device); InstLocalVars = new GpuVarsBuffer(device); + BoneMatrices = new GpuABuffer(device, 255); InitInstGlobalVars(); //supported layouts - requires Position, Normal, Colour, Texcoord layouts.Add(VertexType.Default, new InputLayout(device, vspnctbytes, VertexTypeDefault.GetLayout())); - layouts.Add(VertexType.PNCH2, new InputLayout(device, vspnctbytes, VertexTypePNCH2.GetLayout())); - layouts.Add(VertexType.PBBNCT, new InputLayout(device, vspnctbytes, VertexTypePBBNCT.GetLayout())); - + layouts.Add(VertexType.PNCH2, new InputLayout(device, vspnctbytes, VertexTypePNCH2.GetLayout()));//TODO? layouts.Add(VertexType.PNCTT, new InputLayout(device, vspncttbytes, VertexTypePNCTT.GetLayout())); - layouts.Add(VertexType.PNCTTT, new InputLayout(device, vspncttbytes, VertexTypePNCTTT.GetLayout())); - layouts.Add(VertexType.PBBNCTT, new InputLayout(device, vspncttbytes, VertexTypePBBNCTT.GetLayout())); - layouts.Add(VertexType.PBBNCTTT, new InputLayout(device, vspncttbytes, VertexTypePBBNCTTT.GetLayout())); - + layouts.Add(VertexType.PNCTTT, new InputLayout(device, vspnctttbytes, VertexTypePNCTTT.GetLayout())); layouts.Add(VertexType.PNCCT, new InputLayout(device, vspncctbytes, VertexTypePNCCT.GetLayout())); - layouts.Add(VertexType.PBBNCCT, new InputLayout(device, vspncctbytes, VertexTypePBBNCCT.GetLayout())); - layouts.Add(VertexType.PNCCTT, new InputLayout(device, vspnccttbytes, VertexTypePNCCTT.GetLayout())); - - layouts.Add(VertexType.PNCCTTTT, new InputLayout(device, vspncctttbytes, VertexTypePNCCTTTT.GetLayout())); + layouts.Add(VertexType.PNCCTTTT, new InputLayout(device, vspncctttbytes, VertexTypePNCCTTTT.GetLayout()));//TODO..? //normalmap layouts - requires Position, Normal, Colour, Texcoord, Tangent (X) layouts.Add(VertexType.DefaultEx, new InputLayout(device, vspnctxbytes, VertexTypeDefaultEx.GetLayout())); layouts.Add(VertexType.PCCH2H4, new InputLayout(device, vspnctxbytes, VertexTypePCCH2H4.GetLayout())); - layouts.Add(VertexType.PBBNCTX, new InputLayout(device, vspnctxbytes, VertexTypePBBNCTX.GetLayout())); - layouts.Add(VertexType.PNCCTX, new InputLayout(device, vspncctxbytes, VertexTypePNCCTX.GetLayout())); - layouts.Add(VertexType.PBBNCCTX, new InputLayout(device, vspncctxbytes, VertexTypePBBNCCTX.GetLayout())); - layouts.Add(VertexType.PNCTTX, new InputLayout(device, vspncttxbytes, VertexTypePNCTTX.GetLayout())); - layouts.Add(VertexType.PBBNCTTX, new InputLayout(device, vspncttxbytes, VertexTypePBBNCTTX.GetLayout())); - layouts.Add(VertexType.PBBNCTTTX, new InputLayout(device, vspncttxbytes, VertexTypePBBNCTTTX.GetLayout())); - layouts.Add(VertexType.PNCCTTX, new InputLayout(device, vspnccttxbytes, VertexTypePNCCTTX.GetLayout())); layouts.Add(VertexType.PNCCTTX_2, new InputLayout(device, vspnccttxbytes, VertexTypePNCCTTX_2.GetLayout())); layouts.Add(VertexType.PNCTTTX, new InputLayout(device, vspnctttxbytes, VertexTypePNCTTTX.GetLayout())); layouts.Add(VertexType.PNCTTTX_2, new InputLayout(device, vspnctttxbytes, VertexTypePNCTTTX_2.GetLayout())); layouts.Add(VertexType.PNCTTTX_3, new InputLayout(device, vspnctttxbytes, VertexTypePNCTTTX_3.GetLayout())); - layouts.Add(VertexType.PNCTTTTX, new InputLayout(device, vspnctttxbytes, VertexTypePNCTTTTX.GetLayout())); + layouts.Add(VertexType.PNCTTTTX, new InputLayout(device, vspnctttxbytes, VertexTypePNCTTTTX.GetLayout()));//TODO layouts.Add(VertexType.PNCCTTTX, new InputLayout(device, vspncctttxbytes, VertexTypePNCCTTTX.GetLayout())); - layouts.Add(VertexType.PBBNCCTTX, new InputLayout(device, vspnccttxbytes, VertexTypePBBNCCTTX.GetLayout())); + + + + //skinned layouts + layouts.Add(VertexType.PBBNCT, new InputLayout(device, vspbbnctbytes, VertexTypePBBNCT.GetLayout())); + layouts.Add(VertexType.PBBNCTX, new InputLayout(device, vspbbnctxbytes, VertexTypePBBNCTX.GetLayout())); + layouts.Add(VertexType.PBBNCTT, new InputLayout(device, vspbbncttbytes, VertexTypePBBNCTT.GetLayout())); + layouts.Add(VertexType.PBBNCTTT, new InputLayout(device, vspbbnctttbytes, VertexTypePBBNCTTT.GetLayout())); + layouts.Add(VertexType.PBBNCCT, new InputLayout(device, vspbbncctbytes, VertexTypePBBNCCT.GetLayout())); + layouts.Add(VertexType.PBBNCCTX, new InputLayout(device, vspbbncctxbytes, VertexTypePBBNCCTX.GetLayout())); + layouts.Add(VertexType.PBBNCTTX, new InputLayout(device, vspbbncttxbytes, VertexTypePBBNCTTX.GetLayout())); + layouts.Add(VertexType.PBBNCTTTX, new InputLayout(device, vspbbncttxbytes, VertexTypePBBNCTTTX.GetLayout()));//TODO + layouts.Add(VertexType.PBBNCCTTX, new InputLayout(device, vspbbncctxbytes, VertexTypePBBNCCTTX.GetLayout()));//TODO @@ -366,17 +391,15 @@ namespace CodeWalker.Rendering { case VertexType.Default: case VertexType.PNCH2: - case VertexType.PBBNCT: vs = basicvspnct; break; case VertexType.PNCTT: - case VertexType.PNCTTT: - case VertexType.PBBNCTT: - case VertexType.PBBNCTTT: vs = basicvspnctt; break; + case VertexType.PNCTTT: + vs = basicvspncttt; + break; case VertexType.PNCCT: - case VertexType.PBBNCCT: vs = basicvspncct; break; case VertexType.PNCCTT://not used? @@ -387,23 +410,16 @@ namespace CodeWalker.Rendering break; case VertexType.DefaultEx: case VertexType.PCCH2H4: - case VertexType.PBBNCTX: vs = basicvspnctx; break; - - case VertexType.PBBNCCTX: case VertexType.PNCCTX: vs = basicvspncctx; break; - case VertexType.PNCTTX: - case VertexType.PBBNCTTX: vs = basicvspncttx; break; - case VertexType.PNCCTTX://not used? case VertexType.PNCCTTX_2://not used? - case VertexType.PBBNCCTTX://not used? vs = basicvspnccttx; break; @@ -411,7 +427,6 @@ namespace CodeWalker.Rendering case VertexType.PNCTTTX_2: case VertexType.PNCTTTX_3: case VertexType.PNCTTTTX: //not using last texcoords! - case VertexType.PBBNCTTTX: vs = basicvspnctttx; break; @@ -419,6 +434,34 @@ namespace CodeWalker.Rendering vs = basicvspncctttx; break; + case VertexType.PBBNCT: + vs = basicvspbbnct; + break; + case VertexType.PBBNCTT: + vs = basicvspbbnctt; + break; + case VertexType.PBBNCTTT: + vs = basicvspbbncttt; + break; + case VertexType.PBBNCCT: + vs = basicvspbbncct; + break; + case VertexType.PBBNCTX: + vs = basicvspbbnctx; + break; + case VertexType.PBBNCCTX: + vs = basicvspbbncctx; + break; + case VertexType.PBBNCTTX: + vs = basicvspbbncttx; + break; + case VertexType.PBBNCCTTX://not used? + vs = basicvspbbncctx;//TODO + break; + case VertexType.PBBNCTTTX: + vs = basicvspbbncttx;//TODO + break; + default: break; @@ -514,6 +557,14 @@ namespace CodeWalker.Rendering public override void SetModelVars(DeviceContext context, RenderableModel model) { + if (((model.SkeletonBinding >> 8) & 0xFF) > 0) + { + if (model.Owner.BoneTransforms != null) + { + SetBoneMatrices(context, model.Owner.BoneTransforms); + } + } + if (!model.UseTransform) return; VSModelVars.Vars.Transform = Matrix.Transpose(model.Transform); VSModelVars.Update(context); @@ -730,6 +781,12 @@ namespace CodeWalker.Rendering } } + public void SetBoneMatrices(DeviceContext context, Matrix3_s[] matrices) + { + BoneMatrices.Update(context, matrices); + BoneMatrices.SetVSCBuffer(context, 7); + } + public void SetInstanceVars(DeviceContext context, RenderableInstanceBatch batch) { @@ -920,10 +977,12 @@ namespace CodeWalker.Rendering PSGeomVars.Dispose(); InstGlobalVars.Dispose(); InstLocalVars.Dispose(); + BoneMatrices.Dispose(); basicps.Dispose(); basicvspnct.Dispose(); basicvspnctt.Dispose(); + basicvspncttt.Dispose(); basicvspncct.Dispose(); basicvspncctt.Dispose(); basicvspnccttt.Dispose(); @@ -933,6 +992,13 @@ namespace CodeWalker.Rendering basicvspnccttx.Dispose(); basicvspnctttx.Dispose(); basicvspncctttx.Dispose(); + basicvspbbnct.Dispose(); + basicvspbbnctx.Dispose(); + basicvspbbnctt.Dispose(); + basicvspbbncttt.Dispose(); + basicvspbbncct.Dispose(); + basicvspbbncctx.Dispose(); + basicvspbbncttx.Dispose(); basicvsbox.Dispose(); basicvssphere.Dispose(); basicvscapsule.Dispose(); diff --git a/Rendering/Utils/GpuBuffers.cs b/Rendering/Utils/GpuBuffers.cs index 5300b45..871199b 100644 --- a/Rendering/Utils/GpuBuffers.cs +++ b/Rendering/Utils/GpuBuffers.cs @@ -52,6 +52,48 @@ namespace CodeWalker.Rendering } } + + public class GpuABuffer where T : struct //Dynamic GPU buffer of items updated by CPU, for array of structs used as a constant buffer + { + public int StructSize; + public int StructCount; + public int BufferSize; + public Buffer Buffer; + + public GpuABuffer(Device device, int count) + { + StructCount = count; + StructSize = System.Runtime.InteropServices.Marshal.SizeOf(); + BufferSize = StructCount * StructSize; + Buffer = new Buffer(device, BufferSize, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0); + } + public void Dispose() + { + if (Buffer != null) + { + Buffer.Dispose(); + Buffer = null; + } + } + public void Update(DeviceContext context, T[] data) + { + var dataBox = context.MapSubresource(Buffer, 0, MapMode.WriteDiscard, MapFlags.None); + Utilities.Write(dataBox.DataPointer, data, 0, data.Length); + context.UnmapSubresource(Buffer, 0); + } + + public void SetVSCBuffer(DeviceContext context, int slot) + { + context.VertexShader.SetConstantBuffer(slot, Buffer); + } + public void SetPSCBuffer(DeviceContext context, int slot) + { + context.PixelShader.SetConstantBuffer(slot, Buffer); + } + + } + + public class GpuSBuffer where T : struct //for static struct data as resource view { public int StructSize; @@ -147,6 +189,12 @@ namespace CodeWalker.Rendering Utilities.Write(dataBox.DataPointer, DataArray, 0, CurrentCount); context.UnmapSubresource(Buffer, 0); } + public void Update(DeviceContext context, T[] data) + { + var dataBox = context.MapSubresource(Buffer, 0, MapMode.WriteDiscard, MapFlags.None); + Utilities.Write(dataBox.DataPointer, data, 0, data.Length); + context.UnmapSubresource(Buffer, 0); + } public void SetVSResource(DeviceContext context, int slot) { diff --git a/Shaders/BasicVS.hlsli b/Shaders/BasicVS.hlsli index 0b38ac5..fe52ada 100644 --- a/Shaders/BasicVS.hlsli +++ b/Shaders/BasicVS.hlsli @@ -56,7 +56,10 @@ cbuffer VSInstLocals : register(b6) float3 gLodFadeInstRange; // Offset: 352 Size: 12 [unused] uint gUseComputeShaderOutputBuffer;// Offset: 364 Size: 4 } - +cbuffer BoneMatrices : register(b7) //rage_bonemtx +{ + row_major float3x4 gBoneMtx[255]; // Offset: 0 Size: 12240 +} struct VS_OUTPUT { @@ -254,6 +257,35 @@ float3 GetGrassInstancePosition(float3 ipos, float3 vc0, float3 vc1, uint iid) } +float3x4 BoneMatrix(float4 weights, float4 indices) +{ + uint4 binds = (uint4)(indices * 255.001953); + float3x4 b0 = gBoneMtx[binds.x]; + float3x4 b1 = gBoneMtx[binds.y]; + float3x4 b2 = gBoneMtx[binds.z]; + float3x4 b3 = gBoneMtx[binds.w]; + float4 t0 = b0[0]*weights.x + b1[0]*weights.y + b2[0]*weights.z + b3[0]*weights.w; + float4 t1 = b0[1]*weights.x + b1[1]*weights.y + b2[1]*weights.z + b3[1]*weights.w; + float4 t2 = b0[2]*weights.x + b1[2]*weights.y + b2[2]*weights.z + b3[2]*weights.w; + return float3x4(t0, t1, t2); +} +float3 BoneTransform(float3 ipos, float3x4 m) +{ + float3 r; + float4 p = float4(ipos, 1); + r.x = dot(m[0], p); + r.y = dot(m[1], p); + r.z = dot(m[2], p); + return r; +} +float3 BoneTransformNormal(float3 inorm, float3x4 m) +{ + float3 r; + r.x = dot(m[0].xyz, inorm); + r.y = dot(m[1].xyz, inorm); + r.z = dot(m[2].xyz, inorm); + return r; +} float3 ModelTransform(float3 ipos, float3 vc0, float3 vc1, uint iid) { if (IsInstanced) diff --git a/Shaders/BasicVS_PBBNCCT.cso b/Shaders/BasicVS_PBBNCCT.cso new file mode 100644 index 0000000000000000000000000000000000000000..b2b8008e49b91d221490fa4860be23d6546b5ad2 GIT binary patch literal 11180 zcmcJVUyNK;9mmhkZnxW|P%ObTmB5Gu5eT#kmI`QZ_g}kl+g*3IOG`+WY4>(JbarMl zGYdtD4h^ZOi4Zje4Kb)#NLmdsJYXbB8Xh2GED7shCA1F9?f#%C}xxW8=;3VL*Xb))a1?w8f=Q^PuZFOsO z_38RRLzAaTrTdQP(69ski*>=zn(IgW;7=Fr@jzZ!+KX-UkXbk?W)!fmaE9(ZnA!e zo8fvb-cxQhDrh-HtS^ymZzzCgGf5{$#B`G!o7QZD*bnIDF5!`Znu)pobKjGrS)5qo z`}18mF^2zn32U)_p&C|u&xQM! zG=oLD@bC42zpZ&X2Y*NSqr%z4FggDe{v?1`u9#3D8k;mf2^R2c0=^v_g#q6k@crO2 zIGEv%1pJuhr*iNU!k@{(zbpK74*o;o&t~vvbz;!T%uqg&h2E!e7k6 z-xvN;4&JA_c{vB)ApF%Fe5AbO&%t!PsnGT6vPd~+w7E)rpF4HxRIliL8Tw>p@kq-P z{c5z*(3a+*@QGQm(q`k@3lTeYw;sH(GWxR$I^+Z7jr%>GHxtrM9@IQgf1n@1b}kXEjIpm>aH? zb+)T3jp4X;UmVwhqNZu|7ERRdb?QEGwN&|X+*$2+QZ=*%dv_}jj7V4Ze0(XKcj5$Y z=Ya4|H|qDeJ1Vt>x%g14-f)+3;5E8=KP4Qj8^2L_QMhIH_OO3a^Hl*yr{Q-Bzb1$O zsPOA^@MYm!gsVk(+mGp<@v!FGHKR8xUv)JTSKU;j64zSgR;6BZyUWee(O8XIYvtmS zRk;vxwo$G%57!$@&1_Gfs4c|Di0xMA3o5NA6?zyGY0F=5r-NOQXxZ4O!nOZyny*H; z%}0fU8E)siC7dnb42$6d0*Qz58~%0Sc{%!l@S^y;bN7sJV%v?6)yfB}G0!(2kOOn7 z_KD_btaIfO8U^F4X6oL!(WorM)8$54@mur{t(~>X(!RMZtM0bS|FhD^XzM5tqc_6+ zqCGkNZFIar>okeCp=^t#IC#ES|>yy6~d#?l`1!>}{>bK$3TZ}wOn-WwkpF1HRH*;zh#kOo-M z3ycoZ7MCTA#?@BYNLwLISIhUSaq3|)ue*_YwHm4_>GNbD8A0BVJFLgS&g$}!@@S>m z+P5@YS&AEOWl#OycuA)}?4CbdJ{m9hH?+MvlsfW}s$pZE+j)z4YfUoVbGjy$fg0TFE)rg=0PZ;K*da zi*Mln0tf?~$8N6{J%JgUS@K8#o1Q97%uY=0b;FZmdq?jWo7lB`wv^mV>>ZsL87sNH zQ!{&ZPP&n)$*CDPJGOshYHDWGmFDKHHBOAWQ&Wn|g5>d?hK?xcW5N!G%yW|g=N_Ef zwc1eX!ih_-as+N9_`%m}0nVBM?ytbln!)Vjr5S$K3~(PW&3BpbfDc=ho(ZQ5{TGT`TE`8dqYrzr`6PeYz$;MA$o?y>!?PbkK+@J|wc z&u-UqK<a5ddvt@&i??xcLT7zWYhrC{_>2eJ496~8V;Aco?Zu|MrDLPk z*h5Yhb$_my=sS!hetgJY(z6ae{GYot znN=@+*uFXJACf%dG1_3D^@kjdO9wLYc&`n-CpQQA=i$9I@V*6xyjhskDchv z*t#BD;ghW?Ja**Va|? z^X!Iyo9e2eIC}XTlR5%B9RyeU0$J z&^r=;Wn&|$Ew!(;*o6M^zzYwNf`(pbbL$d0&^GB_wYv7W=Sp%953~<7&ndpdlA5-> zfV~y4e#I4j)l@12K7R%zqup-brn=Z*cAW^cf@lx6-R)f3?nfbFYX2s=So`OXm&H9CR@6#WD{PS5J+n43N z=jH>y{$D&NFMMT()Oq`;G41#EnLhdG?ZX!6=wX)J_2e18lY_}zh;)+<;-gp;5}L(5 z#K2!JPeN-ab%w4z${D$(=9sBj^H(*~iF?pxI!D8q%j(1qv-`abp-*OPG+KYq zXR@;XLi_N!X%ok+zk_GQ$2p*miBlocPdXBQ$-U6{P6j&)QOXn+?HwmCO7em{z3Zet z|5dREvzc15y0IAPpB4O>f=_ZhzxggGjeTD3EpL{4Vo8l53)*mq6S}}M^|8)!W|-|` zCLZ0gZ9lWsEjhRS%%-3HTQhMmnRccmd(d)eIV?oll%Crp{_1mS9a~IR^RtJsnjgE2 z|3q(6n}tYV;Ir9$#O}@NhxB@E{NsjKBKdd$Hd0F`znRoK^poF8*2KYd=nV85FYhPV z$Ucou{w_{x#B^YT^be3D-jytVo7)}v(1!w@_YwB?ucrI+f-cj^j697&tF^&)G3^`l zRMWv)etJGOm<`Mf?enz&pKM8cUUvVr8J?bybLuhsd}069@`c!7lhrFT@$S{EbCb%~ zv#`(V4IYcLY+Y|Y$%a)vW$iFOv~|_tq zwhuoxN`{Y#{P1}QeFXk9K|aq8_Q8K;;J;cJ{Ew|o^gtW#mL-|=NDY5}u_qfZ^lJG2 z<70R{$qO}5i1g!Jo9lP4PJV$Kja9h}^8EQ=|M~LL{Y*lbo=Iu%C`2Ii*UptWU)kJw zeQ;afz>e+3qz8gqKCFLux?;eY&eD4#e@lP#dBX?m0aoYTGT9|z6s=Nrw( zGT?&zyRhd`KKy*V(^H7`MwM4lu{Ha!+vh+uY~-9+{bc*Pz7Kp~_xkiqho)~IuR}|| z9|oweJUTL=Q%`wx^y|6kZSU?&@ITg<=u>=rO?ch%kNL5O68rI05l{Ux9NpIMY(FyX ztZ>%R51)pwU2mi0XJ^Sy>ms`+yH<{TFGtX=?T*}4>+rq{4>`4dWcF~@%s=#-&73Xs zArg~w{MwbCYm`&`Z?-CCR^R#I7`wG7Ej>3S>+GJSV?0v=eptDJ=SZ8BQ{49=U z6LM60{<+6`)i-OV2B2y9`t#>1)Su-a;-zxS&JH|15vc#}9@tn+`hk5@b9QX_v+)sh z;^fcXN6-s_e*7co*dfinUn7ec_*wZf8t2w%$Q#elII~6*DWw$^3-&ScdWa~#Um%Z~ z_A-ul`UQ0M=h5MXj_y1KA=hN0v`84c`yE?H0E% zOZNY*A7t$zb`0~$Y&Jik<@E#btk3iVhUEBuzLO*iFOpRx8_Mne*VsSIOt_|N^%=AI^tbU6P zXW3-$*0Y7bpL<*72lB?hn&j2~oglF-d9RS10pl-3V$Qr@v8F$AiQxOFm!}x?3gFyv z&ybw-ZwiV0P7n2cTkju!uX-pmnDx*+Iz8WdXdaz+Q|R>2JUaeEr-u_8dU#ep_G7cv z$++T*PB5!0^Fz_|a>zSABhRlD2V_FOQhKs<HbQdB4o#ACee@k?4bJQW)3V+GJf5z(HLEtmYe|HEYzQ}=(Z;C>s zpN`$q)84@za)Iqh+!8qrVc2Os1wOC~0!EyWJtT~EA<|Drw!hKGMNesbVhcGX#*EVJ k&e@jc-|IpaLv`x^-v;c(&hY)BRsKL-EEsCq0*%oYu3H#}69kF?xq(sS4;KyEK=mI9>H;cY^pE}%#|Z+YKnufv zxM`yO1{1m3q75YM1J3t!FpuTmEgOHr?ztx?c`2r&??2Mi`$= zTbp5sq>~%1^Ysm6@iyPOz{^CdnVzb5+YPkb#Md8_ZSTr~x1*pFBYe7F3tLog4d0LG z<|4pAGm~a2XuTaF+spMg2EQ@N2?vl;D3V{Phz2RpD<$_#1kseOLXr zOYnad{$>gOFT%f5g8!TF@0Q>{6aH2SKBT<)UJ1TW_}eA;WPQ``gT+=yt{c>2o^sA; zD~P%i6KVI^G;Ib&9nI+kKJ^uU6#!W#M2&{IkNV z!Y#5-g!%L89||}+4S!Pj!zKLB2>(n8z9syyaFqye`xU*@zM}pK_2`Y|E3cN)4Y$y4 zq|I)<+h{f2Y`s%^CRL%>x%C$8yp&9(FjzCGf6Lgo3SL=SB) zFZpZk^2;g);@5W%gG-VN{Tc5?dTZ)e}`_uQ(nquHRC18)d7Kfqyr`y1h`smTA2 z!nrS*KaKw#;Z@;9Km1TQ{=rP_eP8ds=^W#Z7R=A_J;D>=MLC}mzF2}E68==c)#dv# z5x%AOqW$y2pA%lR|BUdS@S@&^@E3&_?f)I&FPF%D)r<9K(lviWJFQKw9A5Vu zda2%APtAZw-8wlvkv6H?cK6CLKS9~)*1fvrw9~a=Yf|dk_4PEX66^D=wHcX3N@p6@ z&veqs*5=lBH{~vvwimX$dYRb1cv05=SU#k2FY-AS-q-zAuX}~MUeWo%>F6)&;@uwt zVex(?ygxL(;TP`Y!?WjBw~rkC`FbbPlTcRi1x&}BJl$$9ot#+pD*!psT2;IrW%y~y z{!EbnL>LqAg)kR}9J6(yvx$=WFxT%nMa~(%4Ab z)uV?VJ@o5G4<9~sn4dm9^~LGAle5dU>}Brs)ZFBB&7EFYI(1^+O)ktYEVA$fUtf{umyvMjoe( z8;(pG{A@k%hn3YlG$8=F>$6DQyjh!_KKu4B$;Yy=BOy=Ex`A_A-pn6Yz0K&hcMZK= z_KxlN!QRo$WAD&BeI%2|nm7xM&RST*xj<(P|0AJKBIYTog8p`}Um~`$@tHHueI1c{ zM>puIc-!}9bjBZOjIV7BpYdRu;n-zk>|#8wx!7bl_B*prn+KZW*9iDd1&gpY>Wk*!xYwzJ$)Dcg-r=${F^ z@Zc$E=!LejCzAthzuuLryRUk#EcWm~`$+wY{EIKiX^RWkdjT7kU*T6yb!mA znC5%?OrO^1?ZX!6=%JU~y~G*5>!Vp;N%WF8{3BmfGMf24_`rPOWr-I1C!_VUJVVzh z#f;dJbM)k_tyej-EXwCy`#6p z$37sB@lz$yPu?vq$7PN`rCv<^D`LV}hW|+;R#~(%6HlN<|mYCaodehJR zBat6WrtK-o9<^9n3@eEy<@+}Czv^6`$L5oMe&*2n`LWCRuMK9oSxE#2KI?6b*nL3t zkXnz8|GMw{iPm@zHj+!%|1isU=-2-!8{-Glp*=8cyxdQ)k$Gx6@w-3E5z~PU(mz6s zxGS0e4)k{9Lmv-x?jy_{?x*|xf-ciZk36+e%eB#7HLn}gRMWv&>-2m~FdOJ;n&)!? zKG~Ajymzf(LV#fMRFLm3;HOP#8Hlv(|COxC%2Rb>|=qm~T=a@Zu^^LQ3Np#{c zJdoFi5p?;vS|c>s@8gaAvgO{GZnAr>_c?nIZgUvRL%F~4lgXxMk68TSwH%WkANLpw zaX4;$8P5S}8`PwX$M2)O|3P8!zqC8k18t%xOERgEYJUG>PwX%Bs`>ikeRwsC3pr3p^y6HQ=bzr5 z|4m-h`eGU6`TfECyTzq=CLv5`QeHbM2?+Id=ZW@L96PTMZmS#EajcrvKyZtP)eldX z57^T&eIW6#)JGpT)?hWj^1Mi6hSA8Eamn<4P|tk6(Y!AMF38`7J&)qy`>Q)O1z(RT zy{hu9*@xXe2BKjj`^54muIu_f@O9nm)0qxU-#%W4hI~JakY8nVWI`vO%IN6Vx#(># z)+P8~8p`y^KRzeCZmp00r57^$S*tvrugh?BTfMXS$h5t}UPnKCYCd@>@`~-`pstcmaXI9AMD7M48NyhU$7SQndanY zipeth^n9b)`mrB-VtOSJlXLvqlkaPjhn>Uv?quHZ^Hu%whoc?aV?RQNhK5Qy^PAmQd=0vt`HFGuWBg}+G@Fp4-1Fxi+tHyj$?tjQTK>oOTvq+2nSQgG_1QX#HOBn1 z60PNWShIZN^)Vk=Id9NYtT9D;CDFvJCF=ZRewU>_m$2V#vwlkV7K=Cc9C)OEcTqmE zgeF;i`D4CiAJCwiyn~8&OlJ)J!62(hN4}k5@LK+uk8R(X4zcv*kI^j_$jfC!J{Nq) z{3(ldZfD3flTWNnXED}ot&uhK<+sjY?~ibvSgeiLWEEpwq*oFN4lxdWo`>>{k2MS? z&w7hBG-6F7)+RsqRj5V9ze|2oduuGjF8+?=t~$iLwNV328@pnRteN1CM zv?M6u5!XtR$~Zf&wbS;KUZfkbHMBjE~9g2urs)f&e;W>Gq{Y-`k`|Nz&G3hV*S{U z&6X!K@+&&QEU#=G@}8ID=WESA{>Tjb8~TIN6Vs7zblWq~f1(;kvl^lL;qO7vxIf~X z=&bNH9-5aS9sHfZOFfStzQE005eFZiL7>=13ln#lowPt*UUu|C6) z&;PICV=(;9cj@EuSJ1ty9Wd;|e&fT|%!e5UA9OoQ-~+oy7<2KNu#s_Lj4O$LWPf=4 xi#}8bYBO_(i7$Sk)s{~zch&z$53*>V(DQXY*p0o|dbftYxG|r3_~dTw{{YQgPgMW_ literal 0 HcmV?d00001 diff --git a/Shaders/BasicVS_PBBNCCTX.hlsl b/Shaders/BasicVS_PBBNCCTX.hlsl new file mode 100644 index 0000000..02ebae2 --- /dev/null +++ b/Shaders/BasicVS_PBBNCCTX.hlsl @@ -0,0 +1,49 @@ +#include "BasicVS.hlsli" + +struct VS_INPUT +{ + float4 Position : POSITION; + float4 BlendWeights : BLENDWEIGHTS; + float4 BlendIndices : BLENDINDICES; + float3 Normal : NORMAL; + float4 Colour0 : COLOR0; + float4 Colour1 : COLOR1; + float2 Texcoord0 : TEXCOORD0; + float4 Tangent : TANGENT; +}; + + +VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) +{ + VS_OUTPUT output; + float3x4 bone = BoneMatrix(input.BlendWeights, input.BlendIndices); + float3 bpos = BoneTransform(input.Position.xyz, bone); + float3 opos = ModelTransform(bpos, input.Colour0.xyz, input.Colour1.xyz, iid); + float4 cpos = ScreenTransform(opos); + float3 bnorm = BoneTransformNormal(input.Normal.xyz, bone); + float3 btang = BoneTransformNormal(input.Tangent.xyz, bone); + float3 onorm = NormalTransform(bnorm); + float3 otang = NormalTransform(btang); + + float4 tnt = ColourTint(input.Colour0.b, input.Colour1.b, iid); //colour tinting if enabled + + float4 lightspacepos; + float shadowdepth = ShadowmapSceneDepth(opos, lightspacepos); + output.LightShadow = lightspacepos; + output.Shadows = float4(shadowdepth, 0, 0, 0); + + output.Position = cpos; + output.CamRelPos = opos; + output.Normal = onorm; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); + output.Texcoord1 = 0.5; // input.Texcoord; + output.Texcoord2 = 0.5; // input.Texcoord; + output.Colour0 = input.Colour0; + output.Colour1 = input.Colour1; + output.Tint = tnt; + output.Tangent = float4(otang, input.Tangent.w); + output.Bitangent = float4(cross(otang, onorm) * input.Tangent.w, 0); + return output; +} + + diff --git a/Shaders/BasicVS_PBBNCT.cso b/Shaders/BasicVS_PBBNCT.cso new file mode 100644 index 0000000000000000000000000000000000000000..4c54fdcd88b4eb15c6841b465e98017c2b375db3 GIT binary patch literal 11148 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 literal 0 HcmV?d00001 diff --git a/Shaders/BasicVS_PBBNCT.hlsl b/Shaders/BasicVS_PBBNCT.hlsl new file mode 100644 index 0000000..eb3f6e8 --- /dev/null +++ b/Shaders/BasicVS_PBBNCT.hlsl @@ -0,0 +1,45 @@ +#include "BasicVS.hlsli" + +struct VS_INPUT +{ + float4 Position : POSITION; + float4 BlendWeights : BLENDWEIGHTS; + float4 BlendIndices : BLENDINDICES; + float3 Normal : NORMAL; + float4 Colour0 : COLOR0; + float2 Texcoord0 : TEXCOORD0; +}; + + +VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) +{ + VS_OUTPUT output; + float3x4 bone = BoneMatrix(input.BlendWeights, input.BlendIndices); + float3 bpos = BoneTransform(input.Position.xyz, bone); + float3 opos = ModelTransform(bpos, input.Colour0.xyz, input.Colour0.xyz, iid); + float4 cpos = ScreenTransform(opos); + float3 bnorm = BoneTransformNormal(input.Normal, bone); + float3 onorm = NormalTransform(bnorm); + float3 otang = 0.5; // NormalTransform(float3(1, 0, 0)); //no tangent to use on this vertex type... + + float4 tnt = ColourTint(input.Colour0.b, 0, iid); //colour tinting if enabled + + float4 lightspacepos; + float shadowdepth = ShadowmapSceneDepth(opos, lightspacepos); + output.LightShadow = lightspacepos; + output.Shadows = float4(shadowdepth, 0, 0, 0); + + output.Position = cpos; + output.CamRelPos = opos; + output.Normal = onorm; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); + output.Texcoord1 = 0.5; // input.Texcoord; + output.Texcoord2 = 0.5; // input.Texcoord; + output.Colour0 = input.Colour0; + output.Colour1 = float4(0.5, 0.5, 0.5, 1); //input.Colour + output.Tint = tnt; + output.Tangent = float4(otang, 1); + output.Bitangent = float4(cross(otang, onorm), 0); + return output; +} + diff --git a/Shaders/BasicVS_PBBNCTT.cso b/Shaders/BasicVS_PBBNCTT.cso new file mode 100644 index 0000000000000000000000000000000000000000..738214912999c0b98eaeeda30244f6b35ec82046 GIT binary patch literal 11172 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 literal 0 HcmV?d00001 diff --git a/Shaders/BasicVS_PBBNCTTT.hlsl b/Shaders/BasicVS_PBBNCTTT.hlsl new file mode 100644 index 0000000..3a61265 --- /dev/null +++ b/Shaders/BasicVS_PBBNCTTT.hlsl @@ -0,0 +1,47 @@ +#include "BasicVS.hlsli" + +struct VS_INPUT +{ + float4 Position : POSITION; + float4 BlendWeights : BLENDWEIGHTS; + float4 BlendIndices : BLENDINDICES; + float3 Normal : NORMAL; + float4 Colour0 : COLOR0; + float2 Texcoord0 : TEXCOORD0; + float2 Texcoord1 : TEXCOORD1; + float2 Texcoord2 : TEXCOORD2; +}; + + +VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) +{ + VS_OUTPUT output; + float3x4 bone = BoneMatrix(input.BlendWeights, input.BlendIndices); + float3 bpos = BoneTransform(input.Position.xyz, bone); + float3 opos = ModelTransform(bpos, input.Colour0.xyz, input.Colour0.xyz, iid); + float4 cpos = ScreenTransform(opos); + float3 bnorm = BoneTransformNormal(input.Normal, bone); + float3 onorm = NormalTransform(bnorm); + float3 otang = 0.5; // NormalTransform(float3(1, 0, 0)); //no tangent to use on this vertex type... + + float4 tnt = ColourTint(input.Colour0.b, 0, iid); //colour tinting if enabled + + float4 lightspacepos; + float shadowdepth = ShadowmapSceneDepth(opos, lightspacepos); + output.LightShadow = lightspacepos; + output.Shadows = float4(shadowdepth, 0, 0, 0); + + output.Position = cpos; + output.CamRelPos = opos; + output.Normal = onorm; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); + output.Texcoord1 = input.Texcoord1; + output.Texcoord2 = input.Texcoord2; + output.Colour0 = input.Colour0; + output.Colour1 = float4(0.5, 0.5, 0.5, 1); //input.Colour + output.Tint = tnt; + output.Tangent = float4(otang, 1); + output.Bitangent = float4(cross(otang, onorm), 0); + return output; +} + diff --git a/Shaders/BasicVS_PBBNCTTX.cso b/Shaders/BasicVS_PBBNCTTX.cso new file mode 100644 index 0000000000000000000000000000000000000000..cf5cc027cb0f98c7db3fdbac3d36b6546b463864 GIT binary patch literal 11804 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 literal 0 HcmV?d00001 diff --git a/Shaders/BasicVS_PBBNCTX.hlsl b/Shaders/BasicVS_PBBNCTX.hlsl new file mode 100644 index 0000000..a34b847 --- /dev/null +++ b/Shaders/BasicVS_PBBNCTX.hlsl @@ -0,0 +1,47 @@ +#include "BasicVS.hlsli" + +struct VS_INPUT +{ + float4 Position : POSITION; + float4 BlendWeights : BLENDWEIGHTS; + float4 BlendIndices : BLENDINDICES; + float3 Normal : NORMAL; + float4 Colour0 : COLOR0; + float2 Texcoord0 : TEXCOORD0; + float4 Tangent : TANGENT; +}; + + +VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) +{ + VS_OUTPUT output; + float3x4 bone = BoneMatrix(input.BlendWeights, input.BlendIndices); + float3 bpos = BoneTransform(input.Position.xyz, bone); + float3 opos = ModelTransform(bpos, input.Colour0.xyz, input.Colour0.xyz, iid); + float4 cpos = ScreenTransform(opos); + float3 bnorm = BoneTransformNormal(input.Normal.xyz, bone); + float3 btang = BoneTransformNormal(input.Tangent.xyz, bone); + float3 onorm = NormalTransform(bnorm); + float3 otang = NormalTransform(btang); + + float4 tnt = ColourTint(input.Colour0.b, 0, iid); //colour tinting if enabled + + float4 lightspacepos; + float shadowdepth = ShadowmapSceneDepth(opos, lightspacepos); + output.LightShadow = lightspacepos; + output.Shadows = float4(shadowdepth, 0, 0, 0); + + output.Position = cpos; + output.CamRelPos = opos; + output.Normal = onorm; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); + output.Texcoord1 = 0.5; // input.Texcoord; + output.Texcoord2 = 0.5; // input.Texcoord; + output.Colour0 = input.Colour0; + output.Colour1 = float4(0.5, 0.5, 0.5, 1); //input.Colour + output.Tint = tnt; + output.Tangent = float4(otang, input.Tangent.w); + output.Bitangent = float4(cross(otang, onorm) * input.Tangent.w, 0); + return output; +} + diff --git a/Shaders/BasicVS_PNCTTT.cso b/Shaders/BasicVS_PNCTTT.cso new file mode 100644 index 0000000000000000000000000000000000000000..6f91fa13ad7d5426f455f7955c49ab2f99cf6afb GIT binary patch literal 10136 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 literal 0 HcmV?d00001 diff --git a/Shaders/BasicVS_PNCTTT.hlsl b/Shaders/BasicVS_PNCTTT.hlsl new file mode 100644 index 0000000..5b08aa6 --- /dev/null +++ b/Shaders/BasicVS_PNCTTT.hlsl @@ -0,0 +1,41 @@ +#include "BasicVS.hlsli" + +struct VS_INPUT +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float4 Colour0 : COLOR0; + float2 Texcoord0 : TEXCOORD0; + float2 Texcoord1 : TEXCOORD1; + float2 Texcoord2 : TEXCOORD2; +}; + + +VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) +{ + VS_OUTPUT output; + float3 opos = ModelTransform(input.Position.xyz, input.Colour0.xyz, input.Colour0.xyz, iid); + float4 cpos = ScreenTransform(opos); + float3 bnorm = NormalTransform(input.Normal); + float3 btang = 0.5; // NormalTransform(float3(1, 0, 0)); //no tangent to use on this vertex type... + + float4 tnt = ColourTint(input.Colour0.b, 0, iid); //colour tinting if enabled + + float4 lightspacepos; + float shadowdepth = ShadowmapSceneDepth(opos, lightspacepos); + output.LightShadow = lightspacepos; + output.Shadows = float4(shadowdepth, 0, 0, 0); + + output.Position = cpos; + output.CamRelPos = opos; + output.Normal = bnorm; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); + output.Texcoord1 = input.Texcoord1; + output.Texcoord2 = input.Texcoord2; + output.Colour0 = input.Colour0; + output.Colour1 = float4(0.5, 0.5, 0.5, 1); //input.Colour + output.Tint = tnt; + output.Tangent = float4(btang, 1); + output.Bitangent = float4(cross(btang, bnorm), 0); + return output; +} \ No newline at end of file diff --git a/Shaders/CodeWalkerShaders.vcxproj b/Shaders/CodeWalkerShaders.vcxproj index fe475e3..33c135b 100644 --- a/Shaders/CodeWalkerShaders.vcxproj +++ b/Shaders/CodeWalkerShaders.vcxproj @@ -150,6 +150,76 @@ Vertex Vertex + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex Vertex @@ -206,6 +276,16 @@ Vertex 4.0 + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex Vertex diff --git a/Shaders/CodeWalkerShaders.vcxproj.filters b/Shaders/CodeWalkerShaders.vcxproj.filters index 4309be7..290c326 100644 --- a/Shaders/CodeWalkerShaders.vcxproj.filters +++ b/Shaders/CodeWalkerShaders.vcxproj.filters @@ -66,6 +66,14 @@ + + + + + + + +