/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// @ifndef STDDEF_OGL_GLSL_SC @define STDDEF_OGL_GLSL_SC /////////////////////////////////////////////////////////////////////////////// // default to 4 for bone transformation w/o bone subcriptions @ifndef S3D_MATBONE_CNT @define S3D_MATBONE_CNT 4 @endif @ifdef S3D_USE_BONESUBSCR @define S3D_BONE_TRANSF_SUBSCR(matBoneFinal, matBone, boneWgh, boneSubscr) \ matBoneFinal \ = boneWgh.x * matBone[int(boneSubscr.x)] \ + boneWgh.y * matBone[int(boneSubscr.y)] \ + boneWgh.z * matBone[int(boneSubscr.z)] \ + boneWgh.w * matBone[int(boneSubscr.w)]; @define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \ attribute vec4 boneWgh; \ attribute vec4 boneSubscr; @define S3D_MATBONE_DECL_STD(matBone) \ uniform mat4 matBone[S3D_MATBONE_CNT]; @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \ mat4 matBoneFinal; \ S3D_BONE_TRANSF_SUBSCR(matBoneFinal, matBone, boneWgh, boneSubscr) @else @ifdef S3D_USE_BONEWGH @define S3D_BONE_TRANSF_WGH(matBoneFinal, matBone, boneWgh) \ matBoneFinal \ = boneWgh.x * matBone[0] \ + boneWgh.y * matBone[1] \ + boneWgh.z * matBone[2] \ + boneWgh.w * matBone[3]; @define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \ attribute vec4 boneWgh; @define S3D_MATBONE_DECL_STD(matBone) \ uniform mat4 matBone[S3D_MATBONE_CNT]; @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \ mat4 matBoneFinal; \ S3D_BONE_TRANSF_WGH(matBoneFinal, matBone, boneWgh) @else @define S3D_BONE_DECL_STD(boneWgh, boneSubscr) @define S3D_MATBONE_DECL_STD(matBone) @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \ mat4 matBoneFinal = gl_ModelViewMatrix @endif @endif /////////////////////////////////////////////////////////////////////////////// float s3d_calcLightRangeFac(float dist, vec4 posRange) { float lightRsqRange = 1.0 / (posRange.w * posRange.w); float rangeFac = max(1.0 - dist * dist * lightRsqRange, 0.0); return rangeFac; } float s3d_calcLightRangeFac(float dist, float quadraticAtten) { float lightRsqRange = quadraticAtten * 0.25; float rangeFac = max(1.0 - dist * dist * lightRsqRange, 0.0); return rangeFac; } /////////////////////////////////////////////////////////////////////////////// struct s3d_ColPair { vec4 diffuse; vec4 specular; }; @define s3d_calcPointLightTermImpl( \ result, camToVertView, normalView, mtrlPower, \ lightPos, lightAmbient, lightDiffuse, lightSpecular, quadraticAtten) \ { \ vec3 vertToLightDirView = normalize(lightPos.xyz - camToVertView.xyz); \ float normalDotVertToLightDir = dot(normalView, vertToLightDirView); \ vec3 camToVertDirView = normalize(camToVertView.xyz); \ vec3 HalfDirView = normalize(vertToLightDirView - camToVertDirView); \ float normalDotHalfDir= dot(normalView, HalfDirView); \ \ float dist = length(lightPos.xyz - camToVertView.xyz); \ float rangeFac = s3d_calcLightRangeFac(dist, quadraticAtten); \ float specular = pow(max(0.0, normalDotHalfDir), mtrlPower) * rangeFac; \ \ result.diffuse = lightAmbient * rangeFac; \ float diffuse = normalDotVertToLightDir * rangeFac; \ result.diffuse += lightDiffuse * diffuse; \ result.specular = lightSpecular * specular; \ } @define s3d_calcPointLightTerm( \ result, camToVertView, normalView, mtrlPower, light, lightProd) \ { \ s3d_calcPointLightTermImpl( \ result, camToVertView, normalView, mtrlPower, light.position, \ lightProd.ambient, lightProd.diffuse, \ lightProd.specular, light.quadraticAttenuation); \ } /////////////////////////////////////////////////////////////////////////////// void s3d_calcBump( out vec3 diffuseDirSurf, out vec3 specularDirSurf, vec3 normalView, vec3 vertToLightDirView, vec3 halfDirView, vec3 tangentUView, vec3 tangentVView) { diffuseDirSurf.x = dot(tangentUView, vertToLightDirView); diffuseDirSurf.y = dot(tangentVView, vertToLightDirView); diffuseDirSurf.z = dot(normalView, vertToLightDirView); specularDirSurf.x = dot(tangentUView, halfDirView); specularDirSurf.y = dot(tangentVView, halfDirView); specularDirSurf.z = dot(normalView, halfDirView); } /////////////////////////////////////////////////////////////////////////////// vec3 s3d_uncomprNormal(vec3 comprNormal) { @ifdef S3D_COMPR_NORMAL return comprNormal / 127.5 - 1; @else return comprNormal; @endif } /////////////////////////////////////////////////////////////////////////////// @endif // STDDEF_OGL_GLSL_SC