// // File: Maya_EnvironmentMap.cgh // // Description : Include file for Maya environment mapping functions // // Lookup enumeration #define kEnvironmentNone 0 #define kEnvironmentSphere 1 #define kEnvironmentCube 2 #define kEyeSpaceEnvSphere 3 #define k3DEnviroment 4 #define kHWEnvCube 5 float4 MAYA_environmentLookup(float3 lookupVector, sampler lookupTexture, int environmentType ) { float4 lookupColor; if (environmentType == kEnvironmentCube) { #if defined(IS_THIS_CORRECT) // this doubles the instructions. float3 axis = abs(lookupVector); if (axis.x >= axis.y && axis.x >= axis.z) { lookupVector.y *= -1.0; lookupVector.z *= -1.0; } else if (axis.z >= axis.y) { lookupVector.x *= -1.0; lookupVector.y *= -1.0; } #endif lookupColor = texCUBE(lookupTexture, lookupVector); } else if (environmentType == kHWEnvCube) { lookupColor = texCUBE(lookupTexture, lookupVector); } else if (environmentType == kEnvironmentSphere) { // This calculation is directly taken from the OpenGL spec's sphere // mapping section. // float x = lookupVector.x; float y = lookupVector.y; float z = lookupVector.z + 1; float m = 2.0 * sqrt(x * x + y * y + z * z); float2 sphereUv = lookupVector.xy / m + 0.5; lookupColor = tex2D(lookupTexture, float3(sphereUv, 1.0)); } else if (environmentType == kEyeSpaceEnvSphere) { // This from is from the Orange book float2 sphereUv; float3 Xunitvec = float3( 1.0, 0.0, 0.0 ); float3 Yunitvec = float3( 0.0, 1.0, 0.0 ); sphereUv.y = dot(lookupVector, Yunitvec ); lookupVector.y = 0.0; sphereUv.x = dot(lookupVector, Xunitvec ) * 0.5; if (lookupVector.z >= 0.0) { sphereUv = (sphereUv+1.0) * 0.5; } else { sphereUv.y = (sphereUv.y + 1.0) * 0.5; sphereUv.x = (-sphereUv.x) * 0.5 + 1.0; } lookupColor = tex2D(lookupTexture, float3(sphereUv, 1.0)); } else if (environmentType == k3DEnviroment) { lookupColor = tex3D(lookupTexture, lookupVector.xyy); } else { lookupColor = tex2D(lookupTexture, lookupVector.xy); } return lookupColor; }