diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index 6159a61..791bb48 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -924,7 +924,7 @@ namespace CodeWalker.GameFiles var pbone = Parent; while (pbone != null) { - pos = pbone.AnimRotation.Multiply(pos * pbone.AnimScale) + pbone.AnimTranslation; + pos = pbone.AnimRotation.Multiply(pos /** pbone.AnimScale*/) + pbone.AnimTranslation; ori = pbone.AnimRotation * ori; pbone = pbone.Parent; } diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index e1b1888..a33b715 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -537,27 +537,68 @@ namespace CodeWalker.Rendering bone.AnimRotation = q; break; case 2: //scale? + v0 = aseq.EvaluateVector(f0); + v1 = aseq.EvaluateVector(f1); + v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; + bone.AnimScale = v.XYZ(); break; - case 5://vector3... - //v0 = aseq.EvaluateVector(f0); - //v1 = aseq.EvaluateVector(f1); - //v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; - //bone.AnimScale = v.XYZ(); + case 5://root motion vector + if (bone.Tag != 0) + { } + //v0 = aseq.EvaluateVector(f0); + //v1 = aseq.EvaluateVector(f1); + //v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; + //bone.AnimTranslation += v.XYZ(); break; - case 6://quaternion... + case 6://quaternion... root rotation? + if (bone.Tag != 0) + { } + //q0 = new Quaternion(aseq.EvaluateVector(f0)); + //q1 = new Quaternion(aseq.EvaluateVector(f1)); + //q = interpolate ? Quaternion.Slerp(q0, q1, falpha) : q0; + //bone.AnimRotation *= q; break; + case 7://vector3... (camera position?) + break; + case 8://quaternion... (camera rotation?) + break; + case 27: + case 50: case 134://single float? case 136: case 137: case 138: case 139: case 140: + if (bone.Tag != 0) + { } break; default: break; } } + for (int i = 0; i < bones.Count; i++) + { + var bone = bones[i]; + var tag = bone.Tag; + switch (bone.Tag) + { + case 23639: tag = 58271; break; //RB_L_ThighRoll: SKEL_L_Thigh + case 6442: tag = 51826; break; //RB_R_ThighRoll: SKEL_R_Thigh + //case 61007: tag = 61163; break; //RB_L_ForeArmRoll: SKEL_L_Forearm //NOT GOOD + //case 5232: tag = 45509; break; //RB_L_ArmRoll: SKEL_L_UpperArm + } + if (tag != bone.Tag) + { + var obone = bone; + if (skel.BonesMap.TryGetValue(tag, out obone)) + { + bone.AnimRotation = obone.AnimRotation; + } + } + } + for (int i = 0; i < bones.Count; i++) { var bone = bones[i]; diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index 0d8ad01..40eb297 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -138,6 +138,7 @@ namespace CodeWalker.Rendering VertexShader basicvspbbncttt; VertexShader basicvspbbncct; VertexShader basicvspbbncctx; + VertexShader basicvspbbnccttx; VertexShader basicvspbbncttx; VertexShader basicvsbox; VertexShader basicvssphere; @@ -199,6 +200,7 @@ namespace CodeWalker.Rendering 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[] vspbbnccttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCCTTX.cso"); byte[] vspbbncttxbytes = File.ReadAllBytes("Shaders\\BasicVS_PBBNCTTX.cso"); byte[] vsboxbytes = File.ReadAllBytes("Shaders\\BasicVS_Box.cso"); @@ -225,6 +227,7 @@ namespace CodeWalker.Rendering basicvspbbncttt = new VertexShader(device, vspbbnctttbytes); basicvspbbncct = new VertexShader(device, vspbbncctbytes); basicvspbbncctx = new VertexShader(device, vspbbncctxbytes); + basicvspbbnccttx = new VertexShader(device, vspbbnccttxbytes); basicvspbbncttx = new VertexShader(device, vspbbncttxbytes); basicvsbox = new VertexShader(device, vsboxbytes); basicvssphere = new VertexShader(device, vsspherebytes); @@ -281,7 +284,7 @@ namespace CodeWalker.Rendering 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 + layouts.Add(VertexType.PBBNCCTTX, new InputLayout(device, vspbbnccttxbytes, VertexTypePBBNCCTTX.GetLayout())); //PBBCCT todo //PBBNC todo @@ -469,8 +472,8 @@ namespace CodeWalker.Rendering case VertexType.PBBNCTTX: vs = basicvspbbncttx; break; - case VertexType.PBBNCCTTX://not used? - vs = basicvspbbncctx;//TODO + case VertexType.PBBNCCTTX: + vs = basicvspbbnccttx; break; case VertexType.PBBNCTTTX: vs = basicvspbbncttx;//TODO @@ -1023,6 +1026,7 @@ namespace CodeWalker.Rendering basicvspbbncttt.Dispose(); basicvspbbncct.Dispose(); basicvspbbncctx.Dispose(); + basicvspbbnccttx.Dispose(); basicvspbbncttx.Dispose(); basicvsbox.Dispose(); basicvssphere.Dispose(); diff --git a/Shaders/BasicVS_PBBNCCTTX.cso b/Shaders/BasicVS_PBBNCCTTX.cso new file mode 100644 index 0000000..d3482f5 Binary files /dev/null and b/Shaders/BasicVS_PBBNCCTTX.cso differ diff --git a/Shaders/BasicVS_PBBNCCTTX.hlsl b/Shaders/BasicVS_PBBNCCTTX.hlsl new file mode 100644 index 0000000..89a3e8a --- /dev/null +++ b/Shaders/BasicVS_PBBNCCTTX.hlsl @@ -0,0 +1,75 @@ +#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; + float2 Texcoord1 : TEXCOORD1; + 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 = input.Texcoord1; // 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; +} + + +/* + + + + +WIND FOR CLOTHING + +mul r1.xyz, v8.xxzx, umGlobalParams.xxyx //colour[1].XXZX +mul r1.xyz, r1.xyzx, umPedGlobalOverrideParams.xxyx +mul r0.w, v8.y, l(6.283185) //colour[1].Y +mul r2.xyz, umPedGlobalOverrideParams.zzwz, umGlobalParams.zzwz +mad r2.xyz, globalScalars2.xxxx, r2.xyzx, r0.wwww +sincos r2.xyz, null, r2.xyzx +mad r1.xyz, r2.xyzx, r1.xyzx, r4.xyzx //OUTPUT - r4 is base bone transform, r1,r2? + + +translation: + +r1.xyz = umGlobalParams.xxy * umPedGlobalOverrideParams.xxy * vc[1].xxz; +r2.xyz = umGlobalParams.zzw * umPedGlobalOverrideParams.zzw * globalScalars2.xxx + (vc[1].y * 6.283185) +pos.xyz += r1 * cos(r2); + + + +*/ \ No newline at end of file diff --git a/Shaders/CodeWalkerShaders.vcxproj b/Shaders/CodeWalkerShaders.vcxproj index 0bb754e..7fd766b 100644 --- a/Shaders/CodeWalkerShaders.vcxproj +++ b/Shaders/CodeWalkerShaders.vcxproj @@ -160,6 +160,16 @@ Vertex 4.0 + + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex + 4.0 + Vertex 4.0 diff --git a/Shaders/CodeWalkerShaders.vcxproj.filters b/Shaders/CodeWalkerShaders.vcxproj.filters index e871bd8..1d5f731 100644 --- a/Shaders/CodeWalkerShaders.vcxproj.filters +++ b/Shaders/CodeWalkerShaders.vcxproj.filters @@ -75,6 +75,7 @@ +