diff --git a/Assets/Scripts/Data/QModel.cs b/Assets/Scripts/Data/QModel.cs index d00c7d8..7c5f667 100644 --- a/Assets/Scripts/Data/QModel.cs +++ b/Assets/Scripts/Data/QModel.cs @@ -117,8 +117,8 @@ public class QAliasHeader public int poseVerts; public int poseData; public int commands; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins)] public IntPtr[] glTextures; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins)] public IntPtr[] fbTextures; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins * 4)] public IntPtr[] glTextures; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins * 4)] public IntPtr[] fbTextures; [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins)] public int[] texels; // Actually variable sized, but we receive an additional pointer to the first element so we can manually marshal the entire array diff --git a/Assets/Scripts/Modules/RenderModule.Interop.cs b/Assets/Scripts/Modules/RenderModule.Interop.cs index eb10ad3..5300e88 100644 --- a/Assets/Scripts/Modules/RenderModule.Interop.cs +++ b/Assets/Scripts/Modules/RenderModule.Interop.cs @@ -72,8 +72,8 @@ public partial class RenderModule: CallbackHandler var fbTextures = new QGLTexture[QConstants.MaxSkins][]; for (int i = 0; i < QConstants.MaxSkins; ++i) { - glTextures[i] = header.glTextures[i].ToStructArray(4); - fbTextures[i] = header.fbTextures[i].ToStructArray(4); + glTextures[i] = header.glTextures[i * 4].ToStructArray(4); + fbTextures[i] = header.fbTextures[i * 4].ToStructArray(4); } return GetSelf(target).UploadAliasModel( diff --git a/Assets/Scripts/Modules/RenderModule.cs b/Assets/Scripts/Modules/RenderModule.cs index 2f9769c..e709266 100644 --- a/Assets/Scripts/Modules/RenderModule.cs +++ b/Assets/Scripts/Modules/RenderModule.cs @@ -64,10 +64,27 @@ public partial class RenderModule material.mainTexture = textures[texNum]; } + Material fbMaterial = null; + if (fbTextures != null && fbTextures[0] != null && fbTextures[0][0] != null) + { + var fbTexNum = fbTextures[0][0].texNum; + if (fbTexNum > 0 && textures.ContainsKey(fbTexNum)) + { + fbMaterial = new Material(Shader.Find("Universal Render Pipeline/Unlit")); + fbMaterial.mainTexture = textures[fbTexNum]; + fbMaterial.SetFloat("_Surface", 1); // Transparent + fbMaterial.SetFloat("_Blend", 2); // Additive + } + } + if (header.numPoses > 1) { var mr = go.AddComponent(); - mr.material = material; + if (fbMaterial != null) + mr.materials = new[] { material, fbMaterial }; + else + mr.material = material; + mr.sharedMesh = mesh; mr.shadowCastingMode = ShadowCastingMode.Off; mr.receiveShadows = false; @@ -82,7 +99,11 @@ public partial class RenderModule var mf = go.AddComponent(); mf.sharedMesh = mesh; var mr = go.AddComponent(); - mr.material = material; + if (fbMaterial != null) + mr.materials = new[] { material, fbMaterial }; + else + mr.material = material; + mr.shadowCastingMode = ShadowCastingMode.Off; mr.receiveShadows = false; mr.lightProbeUsage = LightProbeUsage.Off;