OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 p.VARYING_DECLARATION_PREFIX + 'position' + | 459 p.VARYING_DECLARATION_PREFIX + 'position' + |
460 p.semanticSuffix('POSITION') + ';\n' + | 460 p.semanticSuffix('POSITION') + ';\n' + |
461 p.buildTexCoords(material, true) + | 461 p.buildTexCoords(material, true) + |
462 p.buildBumpOutputCoords(bumpSampler); | 462 p.buildBumpOutputCoords(bumpSampler); |
463 if (diffuse || specular) { | 463 if (diffuse || specular) { |
464 str += p.VARYING + p.FLOAT3 + ' ' + | 464 str += p.VARYING + p.FLOAT3 + ' ' + |
465 p.VARYING_DECLARATION_PREFIX + 'normal' + | 465 p.VARYING_DECLARATION_PREFIX + 'normal' + |
466 p.semanticSuffix('TEXCOORD' + | 466 p.semanticSuffix('TEXCOORD' + |
467 p.interpolant_++ + '') + ';\n' + | 467 p.interpolant_++ + '') + ';\n' + |
468 p.VARYING + p.FLOAT3 + ' ' + | 468 p.VARYING + p.FLOAT3 + ' ' + |
469 p.VARYING_DECLARATION_PREFIX + 'surfaceToLight' + | 469 p.VARYING_DECLARATION_PREFIX + 'surfacePosition' + |
470 p.semanticSuffix( | 470 p.semanticSuffix( |
471 'TEXCOORD' + p.interpolant_++ + '') + ';\n'; | 471 'TEXCOORD' + p.interpolant_++ + '') + ';\n'; |
472 } | 472 } |
473 if (specular) { | 473 if (specular) { |
474 str += p.VARYING + p.FLOAT3 + ' ' + | 474 str += p.VARYING + p.FLOAT3 + ' ' + |
475 p.VARYING_DECLARATION_PREFIX + 'surfaceToView' + | 475 p.VARYING_DECLARATION_PREFIX + 'surfaceToView' + |
476 p.semanticSuffix( | 476 p.semanticSuffix( |
477 'TEXCOORD' + p.interpolant_++ + '') + ';\n'; | 477 'TEXCOORD' + p.interpolant_++ + '') + ';\n'; |
478 } | 478 } |
479 str += p.END_STRUCT; | 479 str += p.END_STRUCT; |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 effect.name = url; | 829 effect.name = url; |
830 } | 830 } |
831 return effect; | 831 return effect; |
832 }; | 832 }; |
833 | 833 |
834 /** | 834 /** |
835 * Builds a shader string for a given standard COLLADA material type. | 835 * Builds a shader string for a given standard COLLADA material type. |
836 * | 836 * |
837 * @param {!o3d.Material} material Material for which to build the shader. | 837 * @param {!o3d.Material} material Material for which to build the shader. |
838 * @param {string} effectType Type of effect to create ('phong', 'lambert', | 838 * @param {string} effectType Type of effect to create ('phong', 'lambert', |
839 * 'constant'). | 839 * 'constant', 'blinn'). |
| 840 * @param {Object} opt_options Parameters to customize shader code generation. |
| 841 See o3djs.effect.getStandardShader for details on the possible values. |
840 * @return {{description: string, shader: string}} A description and the shader | 842 * @return {{description: string, shader: string}} A description and the shader |
841 * string. | 843 * string. |
842 */ | 844 */ |
843 o3djs.effect.buildStandardShaderString = function(material, | 845 o3djs.effect.buildStandardShaderString = function(material, |
844 effectType) { | 846 effectType, |
| 847 opt_options) { |
| 848 if (!opt_options) { |
| 849 opt_options = {}; |
| 850 } |
| 851 var numLights = 0; |
| 852 var currentLightWorldPos = 'lightWorldPos'; |
| 853 if (opt_options.lights) { |
| 854 numLights = opt_options.lights; |
| 855 currentLightWorldPos = 'lightWorldPosList[i]'; |
| 856 } |
845 var p = o3djs.effect; | 857 var p = o3djs.effect; |
846 var bumpSampler = material.getParam('bumpSampler'); | 858 var bumpSampler = material.getParam('bumpSampler'); |
847 var bumpUVInterpolant; | 859 var bumpUVInterpolant; |
848 var skinning; | 860 var skinning; |
849 | 861 |
850 var maxSkinInfluences = 4; | 862 var maxSkinInfluences = 4; |
851 | 863 |
852 // Hardcode reasonable maximum for number of skinning uniforms. | 864 // Hardcode reasonable maximum for number of skinning uniforms. |
853 // glsl: Table 6.19: minimum MAX_VERTEX_UNIFORM_VECTORS is 128. | 865 // glsl: Table 6.19: minimum MAX_VERTEX_UNIFORM_VECTORS is 128. |
854 // (DX9 requires a minimum of 256, so not a problem in o3d). | 866 // (DX9 requires a minimum of 256, so not a problem in o3d). |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 return getTextureType(textureParam); | 906 return getTextureType(textureParam); |
895 else | 907 else |
896 return '2D'; | 908 return '2D'; |
897 }; | 909 }; |
898 | 910 |
899 /** | 911 /** |
900 * Builds uniform variables common to all standard lighting types. | 912 * Builds uniform variables common to all standard lighting types. |
901 * @return {string} The effect code for the common shader uniforms. | 913 * @return {string} The effect code for the common shader uniforms. |
902 */ | 914 */ |
903 var buildCommonVertexUniforms = function() { | 915 var buildCommonVertexUniforms = function() { |
| 916 //var size = numLights ? '['+numLights+']' : ''; |
904 return 'uniform ' + p.MATRIX4 + ' worldViewProjection' + | 917 return 'uniform ' + p.MATRIX4 + ' worldViewProjection' + |
905 p.semanticSuffix('WORLDVIEWPROJECTION') + ';\n' + | 918 p.semanticSuffix('WORLDVIEWPROJECTION') + ';\n'; |
906 'uniform ' + p.FLOAT3 + ' lightWorldPos;\n'; | |
907 }; | 919 }; |
908 | 920 |
909 /** | 921 /** |
910 * Builds uniform variables common to all standard lighting types. | 922 * Builds uniform variables common to all standard lighting types. |
911 * @return {string} The effect code for the common shader uniforms. | 923 * @return {string} The effect code for the common shader uniforms. |
912 */ | 924 */ |
913 var buildCommonPixelUniforms = function() { | 925 var buildCommonPixelUniforms = function() { |
914 return 'uniform ' + p.FLOAT4 + ' lightColor;\n'; | 926 if (numLights > 0) { |
| 927 return 'uniform ' + p.FLOAT4 + ' lightColorList[' + numLights + '];\n' + |
| 928 'uniform ' + p.FLOAT3 + ' lightWorldPosList[' + numLights + '];\n'; |
| 929 } else { |
| 930 return 'uniform ' + p.FLOAT4 + ' lightColor;\n' + |
| 931 'uniform ' + p.FLOAT3 + ' lightWorldPos' + ';\n'; |
| 932 } |
915 }; | 933 }; |
916 | 934 |
917 /** | 935 /** |
918 * Builds uniform variables common to lambert, phong and blinn lighting types. | 936 * Builds uniform variables common to lambert, phong and blinn lighting types. |
919 * @return {string} The effect code for the common shader uniforms. | 937 * @return {string} The effect code for the common shader uniforms. |
920 */ | 938 */ |
921 var buildLightingUniforms = function() { | 939 var buildLightingUniforms = function() { |
922 return 'uniform ' + p.MATRIX4 + ' world' + | 940 return 'uniform ' + p.MATRIX4 + ' world' + |
923 p.semanticSuffix('WORLD') + ';\n' + | 941 p.semanticSuffix('WORLD') + ';\n' + |
924 'uniform ' + p.MATRIX4 + | 942 'uniform ' + p.MATRIX4 + |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 var type = getSamplerType(samplerParam); | 1002 var type = getSamplerType(samplerParam); |
985 return ' ' + p.FLOAT4 + ' ' + name + ' = ' + p.TEXTURE + type + | 1003 return ' ' + p.FLOAT4 + ' ' + name + ' = ' + p.TEXTURE + type + |
986 '(' + name + 'Sampler, ' + | 1004 '(' + name + 'Sampler, ' + |
987 p.PIXEL_VARYING_PREFIX + name + 'UV);\n' | 1005 p.PIXEL_VARYING_PREFIX + name + 'UV);\n' |
988 } else { | 1006 } else { |
989 return ''; | 1007 return ''; |
990 } | 1008 } |
991 }; | 1009 }; |
992 | 1010 |
993 /** | 1011 /** |
| 1012 * Begins a section of code which is to be run once for each light. |
| 1013 * @return {string} The effect code for the for loop, or the empty string if |
| 1014 * not using multiple lights. |
| 1015 */ |
| 1016 var beginLightLoop = function() { |
| 1017 if (numLights) { |
| 1018 return ' ' + p.FLOAT4 + ' lightColorDiffuse = ' + p.FLOAT4 + '(0);\n' + |
| 1019 ' for (int i = 0; i < ' + numLights + '; i++) {\n'; |
| 1020 } else { |
| 1021 return ''; |
| 1022 } |
| 1023 }; |
| 1024 |
| 1025 /** |
| 1026 * Ends the block of code which is to be run for each light. Adds the current |
| 1027 * light's color times (diffuseExpression) into lightColorDiffuse. |
| 1028 * @param {string} diffuseExpression Expression to multiply by light color. |
| 1029 * @return {string} The effect code to set lightColorDiffuse. |
| 1030 */ |
| 1031 var endLightLoop = function(diffuseExpression) { |
| 1032 if (numLights) { |
| 1033 return ' lightColorDiffuse += ' + |
| 1034 'lightColorList[i] * ( ' + diffuseExpression + ');\n' + |
| 1035 ' }\n'; |
| 1036 } else { |
| 1037 return ' ' + p.FLOAT4 + ' lightColorDiffuse = ' + |
| 1038 'lightColor * (' + diffuseExpression + ');'; |
| 1039 } |
| 1040 }; |
| 1041 |
| 1042 /** |
994 * Builds vertex and fragment shader string for the Constant lighting type. | 1043 * Builds vertex and fragment shader string for the Constant lighting type. |
995 * @param {!o3d.Material} material The material for which to build | 1044 * @param {!o3d.Material} material The material for which to build |
996 * shaders. | 1045 * shaders. |
997 * @param {!Array.<string>} descriptions Array to add descriptions too. | 1046 * @param {!Array.<string>} descriptions Array to add descriptions too. |
998 * @return {string} The effect code for the shader, ready to be parsed. | 1047 * @return {string} The effect code for the shader, ready to be parsed. |
999 */ | 1048 */ |
1000 var buildConstantShaderString = function(material, descriptions) { | 1049 var buildConstantShaderString = function(material, descriptions) { |
1001 descriptions.push('constant'); | 1050 descriptions.push('constant'); |
1002 return buildCommonVertexUniforms() + | 1051 return buildCommonVertexUniforms() + |
1003 buildSkinningUniforms() + | 1052 buildSkinningUniforms() + |
(...skipping 23 matching lines...) Expand all Loading... |
1027 var buildLambertShaderString = function(material, descriptions) { | 1076 var buildLambertShaderString = function(material, descriptions) { |
1028 descriptions.push('lambert'); | 1077 descriptions.push('lambert'); |
1029 return buildCommonVertexUniforms() + | 1078 return buildCommonVertexUniforms() + |
1030 buildLightingUniforms() + | 1079 buildLightingUniforms() + |
1031 buildSkinningUniforms() + | 1080 buildSkinningUniforms() + |
1032 buildVertexDecls(material, true, false) + | 1081 buildVertexDecls(material, true, false) + |
1033 p.beginVertexShaderMain() + | 1082 p.beginVertexShaderMain() + |
1034 p.buildUVPassthroughs(material) + | 1083 p.buildUVPassthroughs(material) + |
1035 positionVertexShaderCode() + | 1084 positionVertexShaderCode() + |
1036 normalVertexShaderCode() + | 1085 normalVertexShaderCode() + |
1037 surfaceToLightVertexShaderCode() + | 1086 surfacePositionVertexShaderCode() + |
1038 bumpVertexShaderCode() + | 1087 bumpVertexShaderCode() + |
1039 p.endVertexShaderMain() + | 1088 p.endVertexShaderMain() + |
1040 p.pixelShaderHeader(material, true, false) + | 1089 p.pixelShaderHeader(material, true, false) + |
1041 buildCommonPixelUniforms() + | 1090 buildCommonPixelUniforms() + |
1042 p.repeatVaryingDecls() + | 1091 p.repeatVaryingDecls() + |
1043 buildColorParam(material, descriptions, 'emissive') + | 1092 buildColorParam(material, descriptions, 'emissive') + |
1044 buildColorParam(material, descriptions, 'ambient') + | 1093 buildColorParam(material, descriptions, 'ambient') + |
1045 buildColorParam(material, descriptions, 'diffuse') + | 1094 buildColorParam(material, descriptions, 'diffuse') + |
1046 buildColorParam(material, descriptions, 'bump', false) + | 1095 buildColorParam(material, descriptions, 'bump', false) + |
1047 p.utilityFunctions() + | 1096 p.utilityFunctions() + |
1048 p.beginPixelShaderMain() + | 1097 p.beginPixelShaderMain() + |
1049 getColorParam(material, 'emissive') + | 1098 getColorParam(material, 'emissive') + |
1050 getColorParam(material, 'ambient') + | 1099 getColorParam(material, 'ambient') + |
1051 getColorParam(material, 'diffuse') + | 1100 getColorParam(material, 'diffuse') + |
1052 getNormalShaderCode() + | 1101 getNormalShaderCode() + |
1053 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + | 1102 beginLightLoop() + |
1054 p.PIXEL_VARYING_PREFIX + 'surfaceToLight);\n' + | 1103 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + |
1055 ' ' + p.FLOAT4 + | 1104 currentLightWorldPos + ' - ' + |
1056 ' litR = lit(dot(normal, surfaceToLight), 0.0, 0.0);\n' + | 1105 p.PIXEL_VARYING_PREFIX + 'surfacePosition);\n' + |
| 1106 ' ' + p.FLOAT4 + |
| 1107 ' litR = lit(dot(normal, surfaceToLight), 0.0, 0.0);\n' + |
| 1108 endLightLoop('ambient * diffuse + diffuse * litR.y') + |
1057 p.endPixelShaderMain(p.FLOAT4 + | 1109 p.endPixelShaderMain(p.FLOAT4 + |
1058 '((emissive +\n' + | 1110 '((emissive +\n' + |
1059 ' lightColor *' + | 1111 ' lightColorDiffuse).rgb,\n' + |
1060 ' (ambient * diffuse + diffuse * litR.y)).rgb,\n' + | |
1061 ' diffuse.a)') + | 1112 ' diffuse.a)') + |
1062 p.entryPoints() + | 1113 p.entryPoints() + |
1063 p.matrixLoadOrder(); | 1114 p.matrixLoadOrder(); |
1064 }; | 1115 }; |
1065 | 1116 |
1066 /** | 1117 /** |
1067 * Builds vertex and fragment shader string for the Blinn lighting type. | 1118 * Builds vertex and fragment shader string for the Blinn lighting type. |
1068 * @param {!o3d.Material} material The material for which to build | 1119 * @param {!o3d.Material} material The material for which to build |
1069 * shaders. | 1120 * shaders. |
1070 * @param {!Array.<string>} descriptions Array to add descriptions too. | 1121 * @param {!Array.<string>} descriptions Array to add descriptions too. |
1071 * @return {string} The effect code for the shader, ready to be parsed. | 1122 * @return {string} The effect code for the shader, ready to be parsed. |
1072 * TODO: This is actually just a copy of the Phong code. | 1123 * TODO: This is actually just a copy of the Phong code. |
1073 * Change to Blinn. | 1124 * Change to Blinn. |
1074 */ | 1125 */ |
1075 var buildBlinnShaderString = function(material, descriptions) { | 1126 var buildBlinnShaderString = function(material, descriptions) { |
1076 descriptions.push('phong'); | 1127 descriptions.push('phong'); |
1077 return buildCommonVertexUniforms() + | 1128 return buildCommonVertexUniforms() + |
1078 buildLightingUniforms() + | 1129 buildLightingUniforms() + |
1079 buildSkinningUniforms() + | 1130 buildSkinningUniforms() + |
1080 buildVertexDecls(material, true, true) + | 1131 buildVertexDecls(material, true, true) + |
1081 p.beginVertexShaderMain() + | 1132 p.beginVertexShaderMain() + |
1082 p.buildUVPassthroughs(material) + | 1133 p.buildUVPassthroughs(material) + |
1083 positionVertexShaderCode() + | 1134 positionVertexShaderCode() + |
1084 normalVertexShaderCode() + | 1135 normalVertexShaderCode() + |
1085 surfaceToLightVertexShaderCode() + | 1136 surfacePositionVertexShaderCode() + |
1086 surfaceToViewVertexShaderCode() + | 1137 surfaceToViewVertexShaderCode() + |
1087 bumpVertexShaderCode() + | 1138 bumpVertexShaderCode() + |
1088 p.endVertexShaderMain() + | 1139 p.endVertexShaderMain() + |
1089 p.pixelShaderHeader(material, true, true) + | 1140 p.pixelShaderHeader(material, true, true) + |
1090 buildCommonPixelUniforms() + | 1141 buildCommonPixelUniforms() + |
1091 p.repeatVaryingDecls() + | 1142 p.repeatVaryingDecls() + |
1092 buildColorParam(material, descriptions, 'emissive') + | 1143 buildColorParam(material, descriptions, 'emissive') + |
1093 buildColorParam(material, descriptions, 'ambient') + | 1144 buildColorParam(material, descriptions, 'ambient') + |
1094 buildColorParam(material, descriptions, 'diffuse') + | 1145 buildColorParam(material, descriptions, 'diffuse') + |
1095 buildColorParam(material, descriptions, 'specular') + | 1146 buildColorParam(material, descriptions, 'specular') + |
1096 buildColorParam(material, descriptions, 'bump', false) + | 1147 buildColorParam(material, descriptions, 'bump', false) + |
1097 'uniform float shininess;\n' + | 1148 'uniform float shininess;\n' + |
1098 'uniform float specularFactor;\n' + | 1149 'uniform float specularFactor;\n' + |
1099 p.utilityFunctions() + | 1150 p.utilityFunctions() + |
1100 p.beginPixelShaderMain() + | 1151 p.beginPixelShaderMain() + |
1101 getColorParam(material, 'emissive') + | 1152 getColorParam(material, 'emissive') + |
1102 getColorParam(material, 'ambient') + | 1153 getColorParam(material, 'ambient') + |
1103 getColorParam(material, 'diffuse') + | 1154 getColorParam(material, 'diffuse') + |
1104 getColorParam(material, 'specular') + | 1155 getColorParam(material, 'specular') + |
1105 getNormalShaderCode() + | 1156 getNormalShaderCode() + |
1106 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + | |
1107 p.PIXEL_VARYING_PREFIX + 'surfaceToLight);\n' + | |
1108 ' ' + p.FLOAT3 + ' surfaceToView = normalize(' + | 1157 ' ' + p.FLOAT3 + ' surfaceToView = normalize(' + |
1109 p.PIXEL_VARYING_PREFIX + 'surfaceToView);\n' + | 1158 p.PIXEL_VARYING_PREFIX + 'surfaceToView);\n' + |
1110 ' ' + p.FLOAT3 + | 1159 beginLightLoop() + |
1111 ' halfVector = normalize(surfaceToLight + ' + | 1160 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + |
1112 p.PIXEL_VARYING_PREFIX + 'surfaceToView);\n' + | 1161 currentLightWorldPos + ' - ' + |
1113 ' ' + p.FLOAT4 + | 1162 p.PIXEL_VARYING_PREFIX + 'surfacePosition);\n' + |
| 1163 ' ' + p.FLOAT3 + |
| 1164 ' halfVector = normalize(surfaceToLight + surfaceToView);\n' + |
| 1165 ' ' + p.FLOAT4 + |
1114 ' litR = lit(dot(normal, surfaceToLight), \n' + | 1166 ' litR = lit(dot(normal, surfaceToLight), \n' + |
1115 ' dot(normal, halfVector), shininess);\n' + | 1167 ' dot(normal, halfVector), shininess);\n' + |
| 1168 endLightLoop('ambient * diffuse + diffuse * litR.y\n' + |
| 1169 ' + specular * litR.z * specularFactor') + |
1116 p.endPixelShaderMain( p.FLOAT4 + | 1170 p.endPixelShaderMain( p.FLOAT4 + |
1117 '((emissive +\n' + | 1171 '((emissive + lightColorDiffuse).rgb,\n' + |
1118 ' lightColor *' + | |
1119 ' (ambient * diffuse + diffuse * litR.y +\n' + | |
1120 ' + specular * litR.z *' + | |
1121 ' specularFactor)).rgb,\n' + | |
1122 ' diffuse.a)') + | 1172 ' diffuse.a)') + |
1123 p.entryPoints() + | 1173 p.entryPoints() + |
1124 p.matrixLoadOrder(); | 1174 p.matrixLoadOrder(); |
1125 }; | 1175 }; |
1126 | 1176 |
1127 /** | 1177 /** |
1128 * Builds vertex and fragment shader string for the Phong lighting type. | 1178 * Builds vertex and fragment shader string for the Phong lighting type. |
1129 * @param {!o3d.Material} material The material for which to build | 1179 * @param {!o3d.Material} material The material for which to build |
1130 * shaders. | 1180 * shaders. |
1131 * @param {!Array.<string>} descriptions Array to add descriptions too. | 1181 * @param {!Array.<string>} descriptions Array to add descriptions too. |
1132 * @return {string} The effect code for the shader, ready to be parsed. | 1182 * @return {string} The effect code for the shader, ready to be parsed. |
1133 */ | 1183 */ |
1134 var buildPhongShaderString = function(material, descriptions) { | 1184 var buildPhongShaderString = function(material, descriptions) { |
1135 descriptions.push('phong'); | 1185 descriptions.push('phong'); |
1136 return buildCommonVertexUniforms() + | 1186 return buildCommonVertexUniforms() + |
1137 buildLightingUniforms() + | 1187 buildLightingUniforms() + |
1138 buildSkinningUniforms() + | 1188 buildSkinningUniforms() + |
1139 buildVertexDecls(material, true, true) + | 1189 buildVertexDecls(material, true, true) + |
1140 p.beginVertexShaderMain() + | 1190 p.beginVertexShaderMain() + |
1141 p.buildUVPassthroughs(material) + | 1191 p.buildUVPassthroughs(material) + |
1142 positionVertexShaderCode() + | 1192 positionVertexShaderCode() + |
1143 normalVertexShaderCode() + | 1193 normalVertexShaderCode() + |
1144 surfaceToLightVertexShaderCode() + | 1194 surfacePositionVertexShaderCode() + |
1145 surfaceToViewVertexShaderCode() + | 1195 surfaceToViewVertexShaderCode() + |
1146 bumpVertexShaderCode() + | 1196 bumpVertexShaderCode() + |
1147 p.endVertexShaderMain() + | 1197 p.endVertexShaderMain() + |
1148 p.pixelShaderHeader(material, true, true) + | 1198 p.pixelShaderHeader(material, true, true) + |
1149 buildCommonPixelUniforms() + | 1199 buildCommonPixelUniforms() + |
1150 p.repeatVaryingDecls() + | 1200 p.repeatVaryingDecls() + |
1151 buildColorParam(material, descriptions, 'emissive') + | 1201 buildColorParam(material, descriptions, 'emissive') + |
1152 buildColorParam(material, descriptions, 'ambient') + | 1202 buildColorParam(material, descriptions, 'ambient') + |
1153 buildColorParam(material, descriptions, 'diffuse') + | 1203 buildColorParam(material, descriptions, 'diffuse') + |
1154 buildColorParam(material, descriptions, 'specular') + | 1204 buildColorParam(material, descriptions, 'specular') + |
1155 buildColorParam(material, descriptions, 'bump', false) + | 1205 buildColorParam(material, descriptions, 'bump', false) + |
1156 'uniform float shininess;\n' + | 1206 'uniform float shininess;\n' + |
1157 'uniform float specularFactor;\n' + | 1207 'uniform float specularFactor;\n' + |
1158 p.utilityFunctions() + | 1208 p.utilityFunctions() + |
1159 p.beginPixelShaderMain() + | 1209 p.beginPixelShaderMain() + |
1160 getColorParam(material, 'emissive') + | 1210 getColorParam(material, 'emissive') + |
1161 getColorParam(material, 'ambient') + | 1211 getColorParam(material, 'ambient') + |
1162 getColorParam(material, 'diffuse') + | 1212 getColorParam(material, 'diffuse') + |
1163 getColorParam(material, 'specular') + | 1213 getColorParam(material, 'specular') + |
1164 getNormalShaderCode() + | 1214 getNormalShaderCode() + |
1165 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + | |
1166 p.PIXEL_VARYING_PREFIX + 'surfaceToLight);\n' + | |
1167 ' ' + p.FLOAT3 + ' surfaceToView = normalize(' + | 1215 ' ' + p.FLOAT3 + ' surfaceToView = normalize(' + |
1168 p.PIXEL_VARYING_PREFIX + 'surfaceToView);\n' + | 1216 p.PIXEL_VARYING_PREFIX + 'surfaceToView);\n' + |
1169 ' ' + p.FLOAT3 + | 1217 beginLightLoop() + |
| 1218 ' ' + p.FLOAT3 + ' surfaceToLight = normalize(' + |
| 1219 currentLightWorldPos + ' - ' + |
| 1220 p.PIXEL_VARYING_PREFIX + 'surfacePosition);\n' + |
| 1221 ' ' + p.FLOAT3 + |
1170 ' halfVector = normalize(surfaceToLight + surfaceToView);\n' + | 1222 ' halfVector = normalize(surfaceToLight + surfaceToView);\n' + |
1171 ' ' + p.FLOAT4 + | 1223 ' ' + p.FLOAT4 + |
1172 ' litR = lit(dot(normal, surfaceToLight), \n' + | 1224 ' litR = lit(dot(normal, surfaceToLight), \n' + |
1173 ' dot(normal, halfVector), shininess);\n' + | 1225 ' dot(normal, halfVector), shininess);\n' + |
| 1226 endLightLoop('ambient * diffuse + diffuse * litR.y +\n' + |
| 1227 ' + specular * litR.z * specularFactor') + |
1174 p.endPixelShaderMain(p.FLOAT4 + | 1228 p.endPixelShaderMain(p.FLOAT4 + |
1175 '((emissive +\n' + | 1229 '((emissive + lightColorDiffuse).rgb,\n' + |
1176 ' lightColor * (ambient * diffuse + diffuse * litR.y +\n' + | |
1177 ' + specular * litR.z *' + | |
1178 ' specularFactor)).rgb,\n' + | |
1179 ' diffuse.a)') + | 1230 ' diffuse.a)') + |
1180 p.entryPoints() + | 1231 p.entryPoints() + |
1181 p.matrixLoadOrder(); | 1232 p.matrixLoadOrder(); |
1182 }; | 1233 }; |
1183 | 1234 |
1184 /** | 1235 /** |
1185 * Builds the position code for the vertex shader. | 1236 * Builds the position code for the vertex shader. |
1186 * @return {string} The code for the vertex shader. | 1237 * @return {string} The code for the vertex shader. |
1187 */ | 1238 */ |
1188 var positionVertexShaderCode = function() { | 1239 var positionVertexShaderCode = function() { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 'worldInverseTranspose') + '.xyz;\n'; | 1284 'worldInverseTranspose') + '.xyz;\n'; |
1234 } else { | 1285 } else { |
1235 return ' ' + p.VERTEX_VARYING_PREFIX + 'normal = ' + | 1286 return ' ' + p.VERTEX_VARYING_PREFIX + 'normal = ' + |
1236 p.mul(p.FLOAT4 + '(' + | 1287 p.mul(p.FLOAT4 + '(' + |
1237 attribute_normal + ', 0)', 'worldInverseTranspose') + | 1288 attribute_normal + ', 0)', 'worldInverseTranspose') + |
1238 '.xyz;\n'; | 1289 '.xyz;\n'; |
1239 } | 1290 } |
1240 }; | 1291 }; |
1241 | 1292 |
1242 /** | 1293 /** |
1243 * Builds the surface to light code for the vertex shader. | 1294 * Builds the surface position code for the vertex shader. To support |
| 1295 * multiple lights, the dot product with each light should then be |
| 1296 * computed in the fragment shader. |
1244 * @return {string} The code for the vertex shader. | 1297 * @return {string} The code for the vertex shader. |
1245 */ | 1298 */ |
1246 var surfaceToLightVertexShaderCode = function() { | 1299 var surfacePositionVertexShaderCode = function() { |
1247 return ' ' + p.VERTEX_VARYING_PREFIX + | 1300 return ' ' + p.VERTEX_VARYING_PREFIX + |
1248 'surfaceToLight = lightWorldPos - \n' + | 1301 'surfacePosition = \n' + |
1249 ' ' + | |
1250 p.mul(p.ATTRIBUTE_PREFIX + 'position', | 1302 p.mul(p.ATTRIBUTE_PREFIX + 'position', |
1251 'world') + '.xyz;\n'; | 1303 'world') + '.xyz;\n'; |
1252 }; | 1304 }; |
1253 | 1305 |
1254 /** | 1306 /** |
1255 * Builds the surface to view code for the vertex shader. | 1307 * Builds the surface to view code for the vertex shader. |
1256 * @return {string} The code for the vertex shader. | 1308 * @return {string} The code for the vertex shader. |
1257 */ | 1309 */ |
1258 var surfaceToViewVertexShaderCode = function() { | 1310 var surfaceToViewVertexShaderCode = function() { |
1259 return ' ' + p.VERTEX_VARYING_PREFIX + | 1311 return ' ' + p.VERTEX_VARYING_PREFIX + |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 | 1391 |
1340 /** | 1392 /** |
1341 * Gets or builds a shader for given standard COLLADA material type. | 1393 * Gets or builds a shader for given standard COLLADA material type. |
1342 * | 1394 * |
1343 * Looks at the material passed in and assigns it an Effect that matches its | 1395 * Looks at the material passed in and assigns it an Effect that matches its |
1344 * Params. If a suitable Effect already exists in pack it will use that Effect. | 1396 * Params. If a suitable Effect already exists in pack it will use that Effect. |
1345 * | 1397 * |
1346 * @param {!o3d.Pack} pack Pack in which to create the new Effect. | 1398 * @param {!o3d.Pack} pack Pack in which to create the new Effect. |
1347 * @param {!o3d.Material} material Material for which to build the shader. | 1399 * @param {!o3d.Material} material Material for which to build the shader. |
1348 * @param {string} effectType Type of effect to create ('phong', 'lambert', | 1400 * @param {string} effectType Type of effect to create ('phong', 'lambert', |
1349 * 'constant'). | 1401 * 'constant', 'blinn'). |
| 1402 * @param {{lights: number}} opt_options Extra options. |
| 1403 * If 'lights' is non-zero, creates an array of light params; otherwise |
| 1404 * only a single light is supported. |
1350 * @return {o3d.Effect} The created effect. | 1405 * @return {o3d.Effect} The created effect. |
1351 */ | 1406 */ |
1352 o3djs.effect.getStandardShader = function(pack, | 1407 o3djs.effect.getStandardShader = function(pack, |
1353 material, | 1408 material, |
1354 effectType) { | 1409 effectType, |
| 1410 opt_options) { |
1355 var record = o3djs.effect.buildStandardShaderString(material, | 1411 var record = o3djs.effect.buildStandardShaderString(material, |
1356 effectType); | 1412 effectType, |
| 1413 opt_options); |
1357 var effects = pack.getObjectsByClassName('o3d.Effect'); | 1414 var effects = pack.getObjectsByClassName('o3d.Effect'); |
1358 for (var ii = 0; ii < effects.length; ++ii) { | 1415 for (var ii = 0; ii < effects.length; ++ii) { |
1359 if (effects[ii].name == record.description && | 1416 if (effects[ii].name == record.description && |
1360 effects[ii].source == record.shader) { | 1417 effects[ii].source == record.shader) { |
1361 return effects[ii]; | 1418 return effects[ii]; |
1362 } | 1419 } |
1363 } | 1420 } |
1364 var effect = pack.createObject('Effect'); | 1421 var effect = pack.createObject('Effect'); |
1365 if (effect) { | 1422 if (effect) { |
1366 effect.name = record.description; | 1423 effect.name = record.description; |
1367 if (effect.loadFromFXString(record.shader)) { | 1424 if (effect.loadFromFXString(record.shader)) { |
1368 return effect; | 1425 return effect; |
1369 } | 1426 } |
1370 pack.removeObject(effect); | 1427 pack.removeObject(effect); |
1371 } | 1428 } |
1372 return null; | 1429 return null; |
1373 }; | 1430 }; |
1374 | 1431 |
1375 /** | 1432 /** |
1376 * Attaches a shader for a given standard COLLADA material type to the | 1433 * Attaches a shader for a given standard COLLADA material type to the |
1377 * material. | 1434 * material. |
1378 * | 1435 * |
1379 * Looks at the material passed in and assigns it an Effect that matches its | 1436 * Looks at the material passed in and assigns it an Effect that matches its |
1380 * Params. If a suitable Effect already exists in pack it will use that Effect. | 1437 * Params. If a suitable Effect already exists in pack it will use that Effect. |
1381 * | 1438 * |
1382 * @param {!o3d.Pack} pack Pack in which to create the new Effect. | 1439 * @param {!o3d.Pack} pack Pack in which to create the new Effect. |
1383 * @param {!o3d.Material} material Material for which to build the shader. | 1440 * @param {!o3d.Material} material Material for which to build the shader. |
1384 * @param {!o3djs.math.Vector3} lightPos Position of the default light. | 1441 * @param {!o3djs.math.Vector3} lightPos Position of the default light. |
1385 * @param {string} effectType Type of effect to create ('phong', 'lambert', | 1442 * @param {string} effectType Type of effect to create ('phong', 'lambert', |
1386 * 'constant'). | 1443 * 'constant', 'blinn'). |
| 1444 * @param {Object} opt_options Extra options for effect.getStandardShader |
1387 * @return {boolean} True on success. | 1445 * @return {boolean} True on success. |
1388 */ | 1446 */ |
1389 o3djs.effect.attachStandardShader = function(pack, | 1447 o3djs.effect.attachStandardShader = function(pack, |
1390 material, | 1448 material, |
1391 lightPos, | 1449 lightPos, |
1392 effectType) { | 1450 effectType, |
| 1451 opt_options) { |
1393 var effect = o3djs.effect.getStandardShader(pack, | 1452 var effect = o3djs.effect.getStandardShader(pack, |
1394 material, | 1453 material, |
1395 effectType); | 1454 effectType, |
| 1455 opt_options); |
1396 if (effect) { | 1456 if (effect) { |
1397 material.effect = effect; | 1457 material.effect = effect; |
1398 effect.createUniformParameters(material); | 1458 effect.createUniformParameters(material); |
1399 | 1459 |
1400 // Set a couple of the default parameters in the hopes that this will | 1460 // Set a couple of the default parameters in the hopes that this will |
1401 // help the user get something on the screen. We check to make sure they | 1461 // help the user get something on the screen. We check to make sure they |
1402 // are not connected to something otherwise we'll get an error. | 1462 // are not connected to something otherwise we'll get an error. |
1403 var param = material.getParam('lightWorldPos'); | 1463 var param = material.getParam('lightWorldPos'); |
1404 if (param && !param.inputConnection) { | 1464 if (param && !param.inputConnection) { |
1405 param.value = lightPos; | 1465 param.value = lightPos; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 effect.name = o3djs.effect.TWO_COLOR_CHECKER_EFFECT_NAME; | 1525 effect.name = o3djs.effect.TWO_COLOR_CHECKER_EFFECT_NAME; |
1466 return effect; | 1526 return effect; |
1467 }; | 1527 }; |
1468 | 1528 |
1469 | 1529 |
1470 // For compatability with o3d code, the default language is o3d shading | 1530 // For compatability with o3d code, the default language is o3d shading |
1471 // language. | 1531 // language. |
1472 o3djs.effect.setLanguage('o3d'); | 1532 o3djs.effect.setLanguage('o3d'); |
1473 | 1533 |
1474 | 1534 |
OLD | NEW |