From 0ea5fc66924303d1bf73ba283a383e2aadee02f2 Mon Sep 17 00:00:00 2001 From: neodarz Date: Sat, 11 Aug 2018 20:21:34 +0200 Subject: Initial commit --- .../nel/meshvp__per__pixel__light_8cpp-source.html | 639 +++++++++++++++++++++ 1 file changed, 639 insertions(+) create mode 100644 docs/doxygen/nel/meshvp__per__pixel__light_8cpp-source.html (limited to 'docs/doxygen/nel/meshvp__per__pixel__light_8cpp-source.html') diff --git a/docs/doxygen/nel/meshvp__per__pixel__light_8cpp-source.html b/docs/doxygen/nel/meshvp__per__pixel__light_8cpp-source.html new file mode 100644 index 00000000..1dd5da5c --- /dev/null +++ b/docs/doxygen/nel/meshvp__per__pixel__light_8cpp-source.html @@ -0,0 +1,639 @@ + + + + nevrax.org : docs + + + + + + + + + + + + + + +
# Home   # nevrax.com   
+ + + + +
Nevrax
+ + + + + + + + + + +
+ + +
+ Nevrax.org
+ + + + + + + +
#News
#Mailing-list
#Documentation
#CVS
#Bugs
#License
+
+ + +
+ + +
+Docs + +
+  + + + + + +
Documentation 
+ +
+Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages   Search  
+

meshvp_per_pixel_light.cpp

Go to the documentation of this file.
00001 
+00007 /* Copyright, 2000-2002 Nevrax Ltd.
+00008  *
+00009  * This file is part of NEVRAX NEL.
+00010  * NEVRAX NEL is free software; you can redistribute it and/or modify
+00011  * it under the terms of the GNU General Public License as published by
+00012  * the Free Software Foundation; either version 2, or (at your option)
+00013  * any later version.
+00014 
+00015  * NEVRAX NEL is distributed in the hope that it will be useful, but
+00016  * WITHOUT ANY WARRANTY; without even the implied warranty of
+00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+00018  * General Public License for more details.
+00019 
+00020  * You should have received a copy of the GNU General Public License
+00021  * along with NEVRAX NEL; see the file COPYING. If not, write to the
+00022  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+00023  * MA 02111-1307, USA.
+00024  */
+00025 
+00026 #include "std3d.h"
+00027 
+00028 #include "3d/meshvp_per_pixel_light.h"
+00029 #include "3d/mesh_base_instance.h"
+00030 #include "3d/driver.h"
+00031 #include "3d/scene.h"
+00032 #include "3d/render_trav.h"
+00033 #include "3d/render_trav.h"
+00034 #include "3d/vertex_program_parse.h"
+00035 
+00036 
+00037 
+00038 #include <string>
+00039 
+00040 
+00041 
+00042 namespace NL3D 
+00043 {
+00044 std::auto_ptr<CVertexProgram>   CMeshVPPerPixelLight::_VertexProgram[NumVp];
+00045 
+00046 // ***************************************************************************
+00047 // Light VP fragment constants start at 24
+00048 static  const uint      VPLightConstantStart = 24;
+00049 
+00050 
+00051 
+00052 // ***************************************************************************
+00053 // ***************************************************************************
+00054 
+00056 // omni lights //
+00058 
+00064 // omni light + specular, no normalization
+00065 static const char*      PPLightingVPCodeBegin =
+00066 "!!VP1.0                                                                                                                                                                \n\
+00067 #compute B = N ^ T                                                                                                                                              \n\
+00068 MOV R6, v[2];                                                                                                                                                   \n\
+00069 MUL R1, R6.yzxw, v[9].zxyw;                                                                                                                             \n\
+00070 MAD R1, v[9].yzxw, -R6.zxyw, R1;                                                                                                                \n\
+00071 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00072 ADD R2, c[4], -v[0];                       # compute L                                                                                  \n\
+00073 DP3 R3, R2, R2;                                    # get L normalized                                                                   \n\
+00074 RSQ R3, R3.x;                                                                                                                                                   \n\
+00075 MUL R2, R3, R2;                                                                                                                                                 \n\
+00076 DP3 o[TEX0].x, v[9], R2;                   # get x of light vector in tangent space             \n\
+00077 DP3 o[TEX0].y, R1, R2;             # get y                                                                                              \n\
+00078 DP3 o[TEX0].z, R6, R2;                     # get z                                                                                              \n\
+00079 #specular part                                                                                                                                                  \n\
+00080 ADD R3, c[5], - v[0];                      # compute V (return to eye)                                                  \n\
+00081 #compute inverse norm of V                                                                                                                              \n\
+00082 DP3 R4, R3, R3;                                                                                                                                                 \n\
+00083 RSQ R4, R4.x;                                                                                                                                                   \n\
+00084 #we normalize V and add it to L                                                                                                                 \n\
+00085 MAD R2, R4, R3, R2; #H in R1                                                                                                                    \n\
+00086                                                                                                                                                                                 \n\
+00087 #normalize H                                                                                                                                                    \n\
+00088 DP3 R3, R2, R2;                                                                                                                                                 \n\
+00089 RSQ R3, R3.x;                                                                                                                                                   \n\
+00090 MUL R2, R3, R2;                                                                                                                                                 \n\
+00091 #compute H in tangent space                                                                                                                             \n\
+00092 DP3 o[TEX2].x, v[9], R2;                                                                                                                                \n\
+00093 DP3 o[TEX2].y, R1, R2;                                                                                                                                  \n\
+00094 DP3 o[TEX2].z, R6, R2;                                                                                                                                  \n\
+00095 # Position in R5 for additionnal lighting                                               \n\
+00096 MOV R5, v[0];                                                                                                                                                   \n\
+00097 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00098 ";
+00099 
+00101 static const char*      PPLightingVPNormalizeCodeBegin =
+00102 "!!VP1.0                                                                                                                                                                \n\
+00103 #normalize the normal                                                                                                                                   \n\
+00104 DP3 R1, v[2], v[2];                                                                                                                                             \n\
+00105 RSQ R1, R1.x;                                                                                                                                                   \n\
+00106 MUL R6, v[2], R1;                                                                                                                                                       \n\
+00107                                                                                                                                                                                 \n\
+00108 #normalize the second vector                                                                                                                    \n\
+00109 DP3     R1, R6, v[9];                                                                                                                                           \n\
+00110 MAD     R1, R6, -R1, v[9]; #subtract the normal component                                                                       \n\
+00111 DP3 R2, R1, R1;                                                                                                                                                 \n\
+00112 RSQ     R2, R2.x;                                                                                                                                                       \n\
+00113 MUL R5, R1, R2; #second basis vector in R5                                                                                              \n\
+00114 #compute B = N ^ T                                                                                                                                              \n\
+00115 MUL R1, R6.yzxw, R5.zxyw;                                                                                                                               \n\
+00116 MAD R1, R5.yzxw, -R6.zxyw, R1; #third basis vector in R1                                                                \n\
+00117                                                                                                                                                                                 \n\
+00118 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00119 ADD R2, c[4], -v[0];                       # compute L                                                                                  \n\
+00120 DP3 R3, R2, R2;                                    # get L normalized                                                                   \n\
+00121 RSQ R3, R3.x;                                                                                                                                                   \n\
+00122 MUL R2, R3, R2;                                                                                                                                                 \n\
+00123 DP3 o[TEX0].x, R5, R2;                     # get x of light vector in tangent space                             \n\
+00124 DP3 o[TEX0].y, R1, R2;             # get y                                                                                              \n\
+00125 DP3 o[TEX0].z, R6, R2;                     # get z                                                                                              \n\
+00126                                                                                                                                                                                 \n\
+00127 #specular part                                                                                                                                                  \n\
+00128 ADD R3, c[5], - v[0];                      # compute V (return to eye)                                                  \n\
+00129 #compute inverse norm of V                                                                                                                              \n\
+00130 DP3 R4, R3, R3;                                                                                                                                                 \n\
+00131 RSQ R4, R4.x;                                                                                                                                                   \n\
+00132 #we normalize V and add it to L                                                                                                                 \n\
+00133 MAD R2, R4, R3, R2; #H in R1                                                                                                                    \n\
+00134                                                                                                                                                                                 \n\
+00135 #normalize H                                                                                                                                                    \n\
+00136 DP3 R3, R2, R2;                                                                                                                                                 \n\
+00137 RSQ R3, R3.x;                                                                                                                                                   \n\
+00138 MUL R2, R3, R2;                                                                                                                                                 \n\
+00139 #compute H in tangent space                                                                                                                             \n\
+00140 DP3 o[TEX2].x, R5, R2;                                                                                                                                  \n\
+00141 DP3 o[TEX2].y, R1, R2;                                                                                                                                  \n\
+00142 DP3 o[TEX2].z, R6, R2;                                                                                                                                  \n\
+00143 # Position in R5 for additionnal lighting                                               \n\
+00144 MOV R5, v[0];                                                                                                                                                   \n\
+00145 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00146 ";
+00147 
+00148 
+00149 // Omni light, no specular
+00150 static const char*      PPLightingNoSpecVPCodeBegin =
+00151 "!!VP1.0                                                                                                                                                                \n\
+00152 #compute B = N ^ T                                                                                                                                              \n\
+00153 MOV R6, v[2];                                                                                                                                                   \n\
+00154 MUL R1, R6.yzxw, v[9].zxyw;                                                                                                                             \n\
+00155 MAD R1, v[9].yzxw, -R6.zxyw, R1;                                                                                                                \n\
+00156                                                                                                                                                                                 \n\
+00157 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00158 ADD R2, c[4], -v[0];                       # compute L                                                                                  \n\
+00159 DP3 R3, R2, R2;                                    # get L normalized                                                                   \n\
+00160 RSQ R3, R3.x;                                                                                                                                                   \n\
+00161 MUL R2, R3, R2;                                                                                                                                                 \n\
+00162 DP3 o[TEX0].x, v[9], R2;                   # get x of light vector in tangent space             \n\
+00163 DP3 o[TEX0].y, R1, R2;             # get y                                                                                              \n\
+00164 DP3 o[TEX0].z, R6, R2;                     # get z                                                                                              \n\
+00165                                                                                                                                                                                 \n\
+00166                                                                                                                                                                                 \n\
+00167 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00168 # Position in R5 for additionnal lighting                                               \n\
+00169 MOV R5, v[0];                                                                                                                                                   \n\
+00170 ";
+00171 
+00173 static const char*      PPLightingVPNormalizeNoSpecCodeBegin =
+00174 "!!VP1.0                                                                                                                                                                \n\
+00175 #normalize the normal                                                                                                                                   \n\
+00176 DP3 R1, v[2], v[2];                                                                                                                                             \n\
+00177 RSQ R1, R1.x;                                                                                                                                                   \n\
+00178 MUL R6, v[2], R1;                                                                                                                                                       \n\
+00179                                                                                                                                                                                 \n\
+00180 #normalize the second vector                                                                                                                    \n\
+00181 DP3     R1, R6, v[9];                                                                                                                                           \n\
+00182 MAD     R1, R6, -R1, v[9]; #subtract the normal component                                                                       \n\
+00183 DP3 R2, R1, R1;                                                                                                                                                 \n\
+00184 RSQ     R2, R2.x;                                                                                                                                                       \n\
+00185 MUL R5, R1, R2; #second basis vector in R5                                                                                              \n\
+00186 #compute B = N ^ T                                                                                                                                              \n\
+00187 MUL R1, R6.yzxw, R5.zxyw;                                                                                                                               \n\
+00188 MAD R1, R5.yzxw, -R6.zxyw, R1; #third basis vector in R1                                                                \n\
+00189                                                                                                                                                                                 \n\
+00190 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00191 ADD R2, c[4], -v[0];                       # compute L                                                                                  \n\
+00192 DP3 R3, R2, R2;                                    # get L normalized                                                                   \n\
+00193 RSQ R3, R3.x;                                                                                                                                                   \n\
+00194 MUL R2, R3, R2;                                                                                                                                                 \n\
+00195 DP3 o[TEX0].x, R5, R2;                     # get x of light vector in tangent space                             \n\
+00196 DP3 o[TEX0].y, R1, R2;             # get y                                                                                              \n\
+00197 DP3 o[TEX0].z, R6, R2;                     # get z                                                                                              \n\
+00198                                                                                                                                                                                 \n\
+00199 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00200 # Position in R5 for additionnal lighting                                               \n\
+00201 MOV R5, v[0];                                                                                                                                                   \n\
+00202 ";
+00203 
+00204 
+00206 // directionnal lights //
+00208 
+00211 
+00212 // directionnal, no normalization
+00213 static const char*      PPLightingDirectionnalVPCodeBegin =
+00214 "!!VP1.0                                                                                                                                                                \n\
+00215 #compute B = N ^ T                                                                                                                                              \n\
+00216 MOV R6, v[2];                                                                                                                                                   \n\
+00217 MUL R1, R6.yzxw, v[9].zxyw;                                                                                                                             \n\
+00218 MAD R1, v[9].yzxw, -R6.zxyw, R1;                                                                                                                \n\
+00219                                                                                                                                                                                 \n\
+00220 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00221 DP3 o[TEX0].x, v[9], -c[4];                # get x of light vector in tangent space             \n\
+00222 DP3 o[TEX0].y, R1, -c[4];           # get y                                                                                             \n\
+00223 DP3 o[TEX0].z, R6, -c[4];                  # get z                                                                                              \n\
+00224                                                                                                                                                                                 \n\
+00225 #specular part                                                                                                                                                  \n\
+00226 ADD R3, c[5], - v[0];                      # compute V (return to eye)                                                  \n\
+00227 #compute inverse norm of V                                                                                                                              \n\
+00228 DP3 R4, R3, R3;                                                                                                                                                 \n\
+00229 RSQ R4, R4.x;                                                                                                                                                   \n\
+00230 #we normalize V and add it to L. It gives H unnormalized                                                                \n\
+00231 MAD R2, R4, R3, -c[4]; #H in R1                                                                                                                 \n\
+00232                                                                                                                                                                                 \n\
+00233 #normalize H                                                                                                                                                    \n\
+00234 DP3 R3, R2, R2;                                                                                                                                                 \n\
+00235 RSQ R3, R3.x;                                                                                                                                                   \n\
+00236 MUL R2, R3, R2;                                                                                                                                                 \n\
+00237 #compute H in tangent space                                                                                                                             \n\
+00238 DP3 o[TEX2].x, v[9], R2;                                                                                                                                \n\
+00239 DP3 o[TEX2].y, R1, R2;                                                                                                                                  \n\
+00240 DP3 o[TEX2].z, R6, R2;                                                                                                                                  \n\
+00241                                                                                                                                                                                 \n\
+00242 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00243 # Position in R5 for additionnal lighting                                               \n\
+00244 MOV R5, v[0];                                                                                                                                                   \n\
+00245 ";
+00246 
+00247 // directionnal + normalization
+00248 static const char*      PPLightingDirectionnalVPNormalizeCodeBegin =
+00249 "!!VP1.0                                                                                                                                                                \n\
+00250 #normalize the normal                                                                                                                                   \n\
+00251 DP3 R1, v[2], v[2];                                                                                                                                             \n\
+00252 RSQ R1, R1.x;                                                                                                                                                   \n\
+00253 MUL R6, v[2], R1;                                                                                                                                               \n\
+00254                                                                                                                                                                                 \n\
+00255 #normalize the second vector                                                                                                                    \n\
+00256 DP3     R1, R6, v[9];                                                                                                                                           \n\
+00257 MAD     R1, R6, -R1, v[9]; #subtract the normal component                                                                       \n\
+00258 DP3 R2, R1, R1;                                                                                                                                                 \n\
+00259 RSQ     R2, R2.x;                                                                                                                                                       \n\
+00260 MUL R5, R1, R2; #second basis vector in R5                                                                                              \n\
+00261 #compute B = N ^ T                                                                                                                                              \n\
+00262 MUL R1, R6.yzxw, R5.zxyw;                                                                                                                               \n\
+00263 MAD R1, R5.yzxw, -R6.zxyw, R1; #third basis vector in R1                                                                \n\
+00264                                                                                                                                                                                 \n\
+00265 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00266 DP3 o[TEX0].x, R5, -c[4];                          # get x of light vector in tangent space                     \n\
+00267 DP3 o[TEX0].y, R1, -c[4];               # get y                                                                                 \n\
+00268 DP3 o[TEX0].z, R6, -c[4];                          # get z                                                                                      \n\
+00269                                                                                                                                                                                 \n\
+00270 #specular part                                                                                                                                                  \n\
+00271 ADD R3, c[5], - v[0];                      # compute V (return to eye)                                                  \n\
+00272 #compute inverse norm of V                                                                                                                              \n\
+00273 DP3 R4, R3, R3;                                                                                                                                                 \n\
+00274 RSQ R4, R4.x;                                                                                                                                                   \n\
+00275 #we normalize V and add it to L                                                                                                                 \n\
+00276 MAD R2, R4, R3, -c[4]; #H in R1                                                                                                                 \n\
+00277                                                                                                                                                                                 \n\
+00278 #normalize H                                                                                                                                                    \n\
+00279 DP3 R3, R2, R2;                                                                                                                                                 \n\
+00280 RSQ R3, R3.x;                                                                                                                                                   \n\
+00281 MUL R2, R3, R2;                                                                                                                                                 \n\
+00282 #compute H in tangent space                                                                                                                             \n\
+00283 DP3 o[TEX2].x, R5, R2;                                                                                                                                  \n\
+00284 DP3 o[TEX2].y, R1, R2;                                                                                                                                  \n\
+00285 DP3 o[TEX2].z, R6, R2;                                                                                                                                  \n\
+00286 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00287 # Position in R5 for additionnal lighting                                               \n\
+00288 MOV R5, v[0];                                                                                                                                                   \n\
+00289 ";
+00290 
+00291 
+00292 // directionnal, no normalization, no specular
+00293 static const char*      PPLightingDirectionnalNoSpecVPCodeBegin =
+00294 "!!VP1.0                                                                                                                                                                \n\
+00295 #compute B = N ^ T                                                                                                                                              \n\
+00296 MOV R6, v[2];                                                                                                                                                   \n\
+00297 MUL R1, R6.yzxw, v[9].zxyw;                                                                                                                             \n\
+00298 MAD R1, v[9].yzxw, -R6.zxyw, R1;                                                                                                                \n\
+00299                                                                                                                                                                                 \n\
+00300 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00301 DP3 o[TEX0].x, v[9], -c[4];                # get x of light vector in tangent space             \n\
+00302 DP3 o[TEX0].y, R1, -c[4];           # get y                                                                                             \n\
+00303 DP3 o[TEX0].z, R6, -c[4];                  # get z                                                                                              \n\
+00304 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00305 # Position in R5 for additionnal lighting                                               \n\
+00306 MOV R5, v[0];                                                                                                                                                   \n\
+00307 ";
+00308 
+00309 // directionnal + normalization, no specular
+00310 static const char*      PPLightingDirectionnalNoSpecVPNormalizeCodeBegin =
+00311 "!!VP1.0                                                                                                                                                                \n\
+00312 #normalize the normal                                                                                                                                   \n\
+00313 DP3 R1, v[2], v[2];                                                                                                                                             \n\
+00314 RSQ R1, R1.x;                                                                                                                                                   \n\
+00315 MUL R6, v[2], R1;                                                                                                                                               \n\
+00316                                                                                                                                                                                 \n\
+00317 #normalize the second vector                                                                                                                    \n\
+00318 DP3     R1, R6, v[9];                                                                                                                                           \n\
+00319 MAD     R1, R6, -R1, v[9]; #subtract the normal component                                                                       \n\
+00320 DP3 R2, R1, R1;                                                                                                                                                 \n\
+00321 RSQ     R2, R2.x;                                                                                                                                                       \n\
+00322 MUL R5, R1, R2; #second basis vector in R5                                                                                              \n\
+00323 #compute B = N ^ T                                                                                                                                              \n\
+00324 MUL R1, R6.yzxw, R5.zxyw;                                                                                                                               \n\
+00325 MAD R1, R5.yzxw, -R6.zxyw, R1; #third basis vector in R1                                                                \n\
+00326                                                                                                                                                                                 \n\
+00327 #vector in tangent space = [ T B N ] * L                                                                                                \n\
+00328 DP3 o[TEX0].x, R5, -c[4];                          # get x of light vector in tangent space                     \n\
+00329 DP3 o[TEX0].y, R1, -c[4];               # get y                                                                                 \n\
+00330 DP3 o[TEX0].z, R6, -c[4];                          # get z                                                                                      \n\
+00331                                                                                                                                                                                 \n\
+00332 # Normal is in R6 for additionnal lighting                                                                                              \n\
+00333 # Position in R5 for additionnal lighting                                               \n\
+00334 MOV R5, v[0];                                                                                                                                                   \n\
+00335 ";
+00336 
+00337 
+00338 
+00339 // End of per pixel lighting code : compute pos and setup texture
+00340 static const char*      PPLightingVPCodeEnd=
+00341 "       # compute in Projection space                                                                                                           \n\
+00342         DP4 o[HPOS].x, c[0], v[0];                                                                                                                      \n\
+00343         DP4 o[HPOS].y, c[1], v[0];                                                                                                                      \n\
+00344         DP4 o[HPOS].z, c[2], v[0];                                                                                                                      \n\
+00345         DP4 o[HPOS].w, c[3], v[0];                                                                                                                      \n\
+00346         MOV o[TEX1].xy, v[8];                                                                                                                           \n\
+00347         END                                                                                                                                                                     \n\
+00348 ";
+00349 
+00350 /***************************************************************/
+00351 /******************* THE FOLLOWING CODE IS COMMENTED OUT *******/
+00352 /***************************************************************
+00353 
+00354 // Test code : map the tangent space vector as the diffuse color
+00355 static const char*      PPLightingVPCodeTest =
+00356 "!!VP1.0                                                                                                                                                        \n\
+00357  # compute in Projection space                                                                                                          \n\
+00358  DP4 o[HPOS].x, c[0], v[0];                                                                                                                     \n\
+00359  DP4 o[HPOS].y, c[1], v[0];                                                                                                                     \n\
+00360  DP4 o[HPOS].z, c[2], v[0];                                                                                                                     \n\
+00361  DP4 o[HPOS].w, c[3], v[0];                                                                                                                     \n\
+00362  MOV o[COL0], v[9];                                                                                                                                     \n\
+00363  END                                                                                                                                                            \n\
+00364 ";
+00365 ***************************************************************/
+00366 
+00367 
+00368 
+00369 
+00370 //=================================================================================
+00371 void    CMeshVPPerPixelLight::initInstance(CMeshBaseInstance *mbi)
+00372 {
+00373         // init the vertexProgram code.
+00374         static  bool    vpCreated= false;
+00375         if(!vpCreated)
+00376         {
+00377                 vpCreated= true;                
+00378 
+00379                 // Gives each vp name
+00380                 // Bit 0 : 1 when it is a directionnal light
+00381                 // Bit 1 : 1 when specular is needed
+00382                 // Bit 2 : 1 when normalization of the tangent space is needed
+00383                 static const char *vpName[] =
+00384                 {
+00385                         //  no spec
+00386                         PPLightingDirectionnalNoSpecVPCodeBegin, 
+00387                         PPLightingNoSpecVPCodeBegin,
+00388                         // specular
+00389                         PPLightingDirectionnalVPCodeBegin,
+00390                         PPLightingVPCodeBegin,                                                                  
+00392                         // no spec
+00393                         PPLightingDirectionnalNoSpecVPNormalizeCodeBegin,
+00394                         PPLightingVPNormalizeNoSpecCodeBegin,
+00395                         // spec
+00396                         PPLightingDirectionnalVPNormalizeCodeBegin,
+00397                         PPLightingVPNormalizeCodeBegin,                                         
+00398                 };
+00399 
+00400                 uint numvp  = sizeof(vpName) / sizeof(const char *);
+00401                 nlassert(NumVp == numvp); // make sure that it is in sync with header..todo : compile time assert :)
+00402                 for (uint vp = 0; vp < NumVp; ++vp)
+00403                 {
+00404                         // \todo yoyo TODO_OPTIM Manage different number of pointLights
+00405                         // NB: never call getLightVPFragment() with normalize, because already done by PerPixel fragment before.
+00406                         std::string vpCode      = std::string(vpName[vp])
+00407                                                                   + std::string("# ***************") // temp for debug
+00408                                                                   + CRenderTrav::getLightVPFragment(CRenderTrav::MaxVPLight-1, VPLightConstantStart, (vp & 2) != 0, false)
+00409                                                                   + std::string("# ***************") // temp for debug
+00410                                                                   + std::string(PPLightingVPCodeEnd);
+00411                         #ifdef NL_DEBUG
+00412 
+00417                                 CVPParser                       vpParser;
+00418                                 CVPParser::TProgram result;
+00419                                 std::string          parseOutput;
+00420                                 if (!vpParser.parse(vpCode.c_str(), result, parseOutput))
+00421                                 {                                       
+00422                                         nlwarning(parseOutput.c_str());
+00423                                         nlassert(0);
+00424                                 }
+00425                         #endif
+00426                         _VertexProgram[vp]= std::auto_ptr<CVertexProgram>(new CVertexProgram(vpCode.c_str()));
+00427                 }
+00428                                 
+00429         }
+00430 }
+00431 
+00432 //=================================================================================
+00433 bool    CMeshVPPerPixelLight::begin(IDriver *drv,
+00434                                                                         CScene *scene, CMeshBaseInstance *mbi,
+00435                                                                         const NLMISC::CMatrix &invertedModelMat,
+00436                                                                         const NLMISC::CVector &viewerPos)
+00437 {
+00438         // test if supported by driver
+00439         if (!
+00440                  (drv->isVertexProgramSupported() 
+00441                   && !drv->isVertexProgramEmulated()
+00442                   &&  drv->supportPerPixelLighting(SpecularLighting)
+00443                  )
+00444            )
+00445         {
+00446                 return false;
+00447         }
+00448         //                      
+00449         CRenderTrav             *renderTrav= scene->getRenderTrav();                    
+00451         renderTrav->beginVPLightSetup(VPLightConstantStart,
+00452                                                                   SpecularLighting,
+00453                                                                   invertedModelMat);
+00454         //
+00455         sint strongestLightIndex = renderTrav->getStrongestLightIndex();
+00456         if (strongestLightIndex == -1) return false; // if no strongest light, disable this vertex program              
+00457         // setup the strongest light
+00459         const CLight &strongestLight  = renderTrav->getDriverLight(strongestLightIndex);
+00460 
+00461         switch (strongestLight.getMode())
+00462         {
+00463                 case CLight::DirectionalLight:
+00464                 {
+00465                         // put light direction in object space
+00466                         NLMISC::CVector lPos = invertedModelMat.mulVector(strongestLight.getDirection());
+00467                         drv->setConstant(4, lPos);
+00468                         _IsPointLight = false;
+00469                 }
+00470                 break;
+00471                 case CLight::PointLight:
+00472                 {
+00473                         // put light in object space
+00474                         NLMISC::CVector lPos = invertedModelMat * strongestLight.getPosition();
+00475                         drv->setConstant(4, lPos);
+00476                         _IsPointLight = true;
+00477                 }
+00478                 break;
+00479                 default:
+00480                         return false;
+00481                 break;
+00482         }
+00483                                 
+00484         
+00485         if (SpecularLighting)
+00486         {
+00487                 // viewer pos in object space
+00488                 NLMISC::CVector vPos = invertedModelMat * viewerPos;
+00489                 drv->setConstant(5, vPos);
+00490         }
+00491                 
+00492         // c[0..3] take the ModelViewProjection Matrix. After setupModelMatrix();
+00493         drv->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity);                     
+00494         //      
+00495         enable(true, drv); // must enable the vertex program before the vb is activated
+00496         //
+00497         return true;
+00498 }
+00499 
+00500 
+00501 //=================================================================================
+00502 void    CMeshVPPerPixelLight::end(IDriver *drv)
+00503 {
+00504         enable(false, drv);
+00505 }
+00506 
+00507 
+00508 //=================================================================================
+00509 void    CMeshVPPerPixelLight::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
+00510 {
+00511         (void)f.serialVersion(0);
+00512         f.serial(SpecularLighting);     
+00513 }       
+00514 
+00515 
+00516 //=================================================================================
+00517 void    CMeshVPPerPixelLight::enable(bool enabled, IDriver *drv)
+00518 {
+00519         if (enabled != _Enabled)
+00520         {
+00521                 nlassert(drv);
+00522                 if (enabled)
+00523                 {
+00524                         /* for (uint k = 0; k < NumVp; ++k)
+00525                         {
+00526                                 nlinfo("test vp %d", k);
+00527                                 drv->activeVertexProgram(_VertexProgram[k].get());
+00528                         } */
+00529                         uint    idVP =   (drv->isForceNormalize() ? 4 : 0) 
+00530                                                    | (SpecularLighting        ? 2 : 0)
+00531                                                    | (_IsPointLight                   ? 1 : 0);
+00532                         //
+00533                         drv->activeVertexProgram(_VertexProgram[idVP].get());
+00534                 }
+00535                 else
+00536                 {
+00537                         drv->activeVertexProgram(NULL);
+00538                 }
+00539                 _Enabled = enabled;
+00540         }
+00541 }
+00542 
+00543 //=================================================================================
+00544 bool  CMeshVPPerPixelLight::setupForMaterial(const CMaterial &mat,
+00545                                                                                          IDriver *drv,
+00546                                                                                          CScene *scene
+00547                                                                                         )
+00548 {
+00549         bool enabled = (mat.getShader() == CMaterial::PerPixelLighting || mat.getShader() == CMaterial::PerPixelLightingNoSpec);
+00550         if (enabled)
+00551         {
+00552                 CRenderTrav             *renderTrav= scene->getRenderTrav();
+00553                 renderTrav->changeVPLightSetupMaterial(mat, true /* exclude strongest*/);               
+00554 
+00555                 NLMISC::CRGBA pplDiffuse, pplSpecular;          
+00556                 renderTrav->getStrongestLightColors(pplDiffuse, pplSpecular);
+00557                 drv->setPerPixelLightingLight(pplDiffuse, pplSpecular, mat.getShininess());
+00558         }
+00559         bool change = (enabled != _Enabled);
+00560         enable(enabled, drv); // enable disable the vertex program (for material that don't have the right shader)
+00561         return change;
+00562 }
+00563 //=================================================================================
+00564 void    CMeshVPPerPixelLight::setupForMaterial(const CMaterial &mat,
+00565                                                                                            IDriver *drv,
+00566                                                                                            CScene *scene,
+00567                                                                                            CVertexBuffer *vb)
+00568 {
+00569         
+00570         if (setupForMaterial(mat, drv, scene)) // a switch from v.p enabled / disabled force to reactivate the vertex buffer.
+00571         {
+00572                 drv->activeVertexBuffer(*vb);           
+00573         }
+00574 }
+00575 
+00576 //=================================================================================
+00577 void    CMeshVPPerPixelLight::setupForMaterial(const CMaterial &mat,
+00578                                                                                            IDriver *drv,
+00579                                                                                            CScene *scene,
+00580                                                                                            IVertexBufferHard *vb)
+00581 {
+00582         
+00583         if (setupForMaterial(mat, drv, scene)) // a switch from v.p enabled / disabled force to reactivate the vertex buffer.
+00584         {
+00585                 drv->activeVertexBufferHard(vb);                
+00586         }
+00587 }
+00588 
+00589 
+00590 } // NL3D
+
+ + +
                                                                                                                                                                    +
+ + -- cgit v1.2.1