//========= Copyright Valve Corporation, All rights reserved. ============// #if defined(_X360) void GetBaseTextureAndNormal(sampler base, sampler base2, sampler bump, bool bBase2, bool bBump, float3 coords, float3 vWeights, out float4 vResultBase, out float4 vResultBase2, out float4 vResultBump) { vResultBase = 0; vResultBase2 = 0; vResultBump = 0; if (!bBump) { vResultBump = float4(0, 0, 1, 1); } #if SEAMLESS vWeights = max(vWeights - 0.3, 0); vWeights *= 1.0f / dot(vWeights, float3(1, 1, 1)); [branch] if (vWeights.x > 0) { vResultBase += vWeights.x * tex2D(base, coords.zy); if (bBase2) { vResultBase2 += vWeights.x * tex2D(base2, coords.zy); } if (bBump) { vResultBump += vWeights.x * tex2D(bump, coords.zy); } } [branch] if (vWeights.y > 0) { vResultBase += vWeights.y * tex2D(base, coords.xz); if (bBase2) { vResultBase2 += vWeights.y * tex2D(base2, coords.xz); } if (bBump) { vResultBump += vWeights.y * tex2D(bump, coords.xz); } } [branch] if (vWeights.z > 0) { vResultBase += vWeights.z * tex2D(base, coords.xy); if (bBase2) { vResultBase2 += vWeights.z * tex2D(base2, coords.xy); } if (bBump) { vResultBump += vWeights.z * tex2D(bump, coords.xy); } } #else // not seamless vResultBase = tex2D(base, coords.xy); if (bBase2) { vResultBase2 = tex2D(base2, coords.xy); } if (bBump) { vResultBump = tex2D(bump, coords.xy); } #endif } #else // PC void GetBaseTextureAndNormal(sampler base, sampler base2, sampler bump, bool bBase2, bool bBump, float3 coords, float3 vWeights, out float4 vResultBase, out float4 vResultBase2, out float4 vResultBump) { vResultBase = 0; vResultBase2 = 0; vResultBump = 0; if (!bBump) { vResultBump = float4(0, 0, 1, 1); } #if SEAMLESS vResultBase += vWeights.x * tex2D(base, coords.zy); if (bBase2) { vResultBase2 += vWeights.x * tex2D(base2, coords.zy); } if (bBump) { vResultBump += vWeights.x * tex2D(bump, coords.zy); } vResultBase += vWeights.y * tex2D(base, coords.xz); if (bBase2) { vResultBase2 += vWeights.y * tex2D(base2, coords.xz); } if (bBump) { vResultBump += vWeights.y * tex2D(bump, coords.xz); } vResultBase += vWeights.z * tex2D(base, coords.xy); if (bBase2) { vResultBase2 += vWeights.z * tex2D(base2, coords.xy); } if (bBump) { vResultBump += vWeights.z * tex2D(bump, coords.xy); } #else // not seamless vResultBase = tex2D(base, coords.xy); if (bBase2) { vResultBase2 = tex2D(base2, coords.xy); } if (bBump) { vResultBump = tex2D(bump, coords.xy); } #endif } #endif float3 LightMapSample(sampler LightmapSampler, float2 vTexCoord) { #if (!defined(_X360) || !defined(USE_32BIT_LIGHTMAPS_ON_360)) { float3 sample = tex2D(LightmapSampler, vTexCoord); return sample; } #else { #if 0 // 1 for cheap sampling, 0 for accurate scaling from the individual // samples { float4 sample = tex2D( LightmapSampler, vTexCoord ); return sample.rgb * sample.a; } #else { float4 Weights; float4 samples_0; // no arrays allowed in inline assembly float4 samples_1; float4 samples_2; float4 samples_3; asm { tfetch2D samples_0, vTexCoord.xy, LightmapSampler, OffsetX = -0.5, OffsetY = -0.5, MinFilter=point, MagFilter=point, MipFilter=keep, UseComputedLOD=false tfetch2D samples_1, vTexCoord.xy, LightmapSampler, OffsetX = 0.5, OffsetY = -0.5, MinFilter=point, MagFilter=point, MipFilter=keep, UseComputedLOD=false tfetch2D samples_2, vTexCoord.xy, LightmapSampler, OffsetX = -0.5, OffsetY = 0.5, MinFilter=point, MagFilter=point, MipFilter=keep, UseComputedLOD=false tfetch2D samples_3, vTexCoord.xy, LightmapSampler, OffsetX = 0.5, OffsetY = 0.5, MinFilter=point, MagFilter=point, MipFilter=keep, UseComputedLOD=false getWeights2D Weights, vTexCoord.xy, LightmapSampler } ; Weights = float4( (1 - Weights.x) * (1 - Weights.y), Weights.x * (1 - Weights.y), (1 - Weights.x) * Weights.y, Weights.x * Weights.y); float3 result; result.rgb = samples_0.rgb * (samples_0.a * Weights.x); result.rgb += samples_1.rgb * (samples_1.a * Weights.y); result.rgb += samples_2.rgb * (samples_2.a * Weights.z); result.rgb += samples_3.rgb * (samples_3.a * Weights.w); return result; } #endif } #endif }