diff options
Diffstat (limited to 'docs/doxygen/nel/driver__opengl__vertex__program_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/driver__opengl__vertex__program_8cpp-source.html | 1451 |
1 files changed, 1451 insertions, 0 deletions
diff --git a/docs/doxygen/nel/driver__opengl__vertex__program_8cpp-source.html b/docs/doxygen/nel/driver__opengl__vertex__program_8cpp-source.html new file mode 100644 index 00000000..01672cd0 --- /dev/null +++ b/docs/doxygen/nel/driver__opengl__vertex__program_8cpp-source.html @@ -0,0 +1,1451 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>driver_opengl_vertex_program.cpp</h1><a href="driver__opengl__vertex__program_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00009 <font class="comment">/* Copyright, 2000 Nevrax Ltd.</font> +00010 <font class="comment"> *</font> +00011 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00012 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00013 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00014 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00015 <font class="comment"> * any later version.</font> +00016 <font class="comment"></font> +00017 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00018 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00019 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00020 <font class="comment"> * General Public License for more details.</font> +00021 <font class="comment"></font> +00022 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00023 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00024 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00025 <font class="comment"> * MA 02111-1307, USA.</font> +00026 <font class="comment"> */</font> +00027 +00028 <font class="preprocessor">#include "<a class="code" href="stdopengl_8h.html">stdopengl.h</a>"</font> +00029 +00030 <font class="preprocessor">#include "<a class="code" href="3d_2primitive__block_8h.html">3d/primitive_block.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="vertex__program_8h.html">3d/vertex_program.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="vertex__program__parse_8h.html">3d/vertex_program_parse.h</a>"</font> +00033 <font class="preprocessor">#include <algorithm></font> +00034 +00035 +00036 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00037 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00038 +00039 +00040 <font class="keyword">namespace </font>NL3D +00041 { +00042 +00043 <font class="comment">// ***************************************************************************</font> +<a name="l00044"></a><a class="code" href="classNL3D_1_1CVertexProgamDrvInfosGL.html#a0">00044</a> CVertexProgamDrvInfosGL::CVertexProgamDrvInfosGL (CDriverGL *drv, <a class="code" href="namespaceNL3D.html#a297">ItVtxPrgDrvInfoPtrList</a> it) : IVertexProgramDrvInfos (drv, it) +00045 { +00046 <font class="comment">// Extension must exist</font> +00047 <a class="code" href="debug_8h.html#a6">nlassert</a> (drv->_Extensions.NVVertexProgram +00048 || drv->_Extensions.EXTVertexShader +00049 ); +00050 +00051 <font class="keywordflow">if</font> (drv->_Extensions.NVVertexProgram) <font class="comment">// nvidia implemntation</font> +00052 { +00053 <font class="comment">// Generate a program</font> +00054 <a class="code" href="driver__opengl__extension_8h.html#a57">nglGenProgramsNV</a> (1, &<a class="code" href="classNL3D_1_1CVertexProgamDrvInfosGL.html#m0">ID</a>); +00055 } +00056 <font class="keywordflow">else</font> +00057 { +00058 <a class="code" href="classNL3D_1_1CVertexProgamDrvInfosGL.html#m0">ID</a> = <a class="code" href="driver__opengl__extension_8h.html#a119">nglGenVertexShadersEXT</a>(1); +00059 } +00060 } +00061 +00062 +00063 <font class="comment">// ***************************************************************************</font> +<a name="l00064"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_0">00064</a> <font class="keywordtype">bool</font> CDriverGL::isVertexProgramSupported ()<font class="keyword"> const</font> +00065 <font class="keyword"></font>{ +00066 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram || <a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader; +00067 } +00068 +00069 <font class="comment">// ***************************************************************************</font> +<a name="l00070"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_1">00070</a> <font class="keywordtype">bool</font> CDriverGL::isVertexProgramEmulated ()<font class="keyword"> const</font> +00071 <font class="keyword"></font>{ +00072 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgramEmulated; +00073 } +00074 +00075 +00076 +00077 <font class="comment">// ***************************************************************************</font> +<a name="l00078"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z414_0">00078</a> <font class="keywordtype">bool</font> CDriverGL::activeNVVertexProgram (CVertexProgram *<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>) +00079 { +00080 <font class="comment">// Setup or unsetup ?</font> +00081 <font class="keywordflow">if</font> (program) +00082 { +00083 <font class="comment">// Enable vertex program</font> +00084 glEnable (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>); +00085 <a class="code" href="classNL3D_1_1CDriverGL.html#o24">_VertexProgramEnabled</a>= <font class="keyword">true</font>; +00086 +00087 +00088 <font class="comment">// Driver info</font> +00089 <a class="code" href="classNL3D_1_1CDriverGL.html#l1">CVertexProgamDrvInfosGL</a> *drvInfo; +00090 +00091 <font class="comment">// Program setuped ?</font> +00092 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo==NULL) +00093 { +00097 <a class="code" href="classCVPParser.html">CVPParser</a> parser; +00098 <a class="code" href="classCVPParser.html#s0">CVPParser::TProgram</a> parsedProgram; +00099 std::string errorOutput; +00100 <font class="keywordtype">bool</font> result = parser.<a class="code" href="classCVPParser.html#a0">parse</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram().c_str(), parsedProgram, errorOutput); +00101 <font class="keywordflow">if</font> (!result) +00102 { +00103 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to parse a vertex program :"</font>); +00104 <a class="code" href="debug_8h.html#a2">nlwarning</a>(errorOutput.c_str()); +00105 <font class="preprocessor"> #ifdef NL_DEBUG</font> +00106 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a6">nlassert</a>(0); +00107 <font class="preprocessor"> #endif</font> +00108 <font class="preprocessor"></font> <font class="keywordflow">return</font> <font class="keyword">false</font>; +00109 } +00110 +00111 <font class="comment">// Insert into driver list. (so it is deleted when driver is deleted).</font> +00112 <a class="code" href="namespaceNL3D.html#a297">ItVtxPrgDrvInfoPtrList</a> it= <a class="code" href="classNL3D_1_1IDriver.html#n5">_VtxPrgDrvInfos</a>.insert(<a class="code" href="classNL3D_1_1IDriver.html#n5">_VtxPrgDrvInfos</a>.end()); +00113 +00114 <font class="comment">// Create a driver info</font> +00115 *it = drvInfo = <font class="keyword">new</font> <a class="code" href="classNL3D_1_1CDriverGL.html#l1">CVertexProgamDrvInfosGL</a> (<font class="keyword">this</font>, it); +00116 +00117 <font class="comment">// Set the pointer</font> +00118 <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo=drvInfo; +00119 +00120 <font class="comment">// Compile the program</font> +00121 <a class="code" href="driver__opengl__extension_8h.html#a68">nglLoadProgramNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, drvInfo->ID, <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram().length(), (<font class="keyword">const</font> GLubyte*)<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram().c_str()); +00122 +00123 <font class="comment">// Get loading error code</font> +00124 GLint errorOff; +00125 glGetIntegerv (<a class="code" href="driver__opengl__extension__def_8h.html#a35">GL_PROGRAM_ERROR_POSITION_NV</a>, &errorOff); +00126 +00127 <font class="comment">// Compilation error ?</font> +00128 <font class="keywordflow">if</font> (errorOff>=0) +00129 { +00130 <font class="comment">// String length</font> +00131 uint length = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram ().length(); +00132 <font class="keyword">const</font> <font class="keywordtype">char</font>* sString= <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram ().c_str(); +00133 +00134 <font class="comment">// Line count and char count</font> +00135 uint line=1; +00136 uint charC=1; +00137 +00138 <font class="comment">// Find the line</font> +00139 uint <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>=0; +00140 <font class="keywordflow">while</font> ((<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a><length)&&(<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a><(uint)errorOff)) +00141 { +00142 <font class="keywordflow">if</font> (sString[<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>]==<font class="charliteral">'\n'</font>) +00143 { +00144 line++; +00145 charC=1; +00146 } +00147 <font class="keywordflow">else</font> +00148 charC++; +00149 +00150 <font class="comment">// Next character</font> +00151 <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>++; +00152 } +00153 +00154 <font class="comment">// Show the error</font> +00155 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Vertex program syntax error line %d character %d\n"</font>, line, charC); +00156 +00157 <font class="comment">// Disable vertex program</font> +00158 glDisable (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>); +00159 <a class="code" href="classNL3D_1_1CDriverGL.html#o24">_VertexProgramEnabled</a>= <font class="keyword">false</font>; +00160 +00161 <font class="comment">// Setup not ok</font> +00162 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00163 } +00164 +00165 <font class="comment">// Setup ok</font> +00166 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00167 } +00168 <font class="keywordflow">else</font> +00169 { +00170 <font class="comment">// Cast the driver info pointer</font> +00171 drvInfo=safe_cast<CVertexProgamDrvInfosGL*>((<a class="code" href="classNL3D_1_1IDriver.html#l4">IVertexProgramDrvInfos</a>*)<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo); +00172 } +00173 +00174 <font class="comment">// Setup this program</font> +00175 <a class="code" href="driver__opengl__extension_8h.html#a54">nglBindProgramNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, drvInfo->ID); +00176 <a class="code" href="classNL3D_1_1CDriverGL.html#o26">_LastSetuppedVP</a> = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>; +00177 +00178 <font class="comment">// Ok</font> +00179 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00180 } +00181 <font class="keywordflow">else</font> <font class="comment">// Unsetup</font> +00182 { +00183 <font class="comment">// Disable vertex program</font> +00184 glDisable (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>); +00185 <a class="code" href="classNL3D_1_1CDriverGL.html#o24">_VertexProgramEnabled</a>= <font class="keyword">false</font>; +00186 <font class="comment">// Ok</font> +00187 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00188 } +00189 } +00190 +00191 +00192 <font class="comment">// ***************************************************************************</font> +00193 <font class="keyword">static</font> +00194 <font class="keyword">inline</font> GLenum <a class="code" href="namespaceNL3D.html#a355">convSwizzleToGLFormat</a>(<a class="code" href="structCVPSwizzle.html#s4">CVPSwizzle::EComp</a> comp, <font class="keywordtype">bool</font> negate) +00195 { +00196 <font class="keywordflow">if</font> (!negate) +00197 { +00198 <font class="keywordflow">switch</font>(comp) +00199 { +00200 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s0">CVPSwizzle::X</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>; +00201 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s1">CVPSwizzle::Y</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>; +00202 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s2">CVPSwizzle::Z</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a>; +00203 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s3">CVPSwizzle::W</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a>; +00204 <font class="keywordflow">default</font>: +00205 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00206 <font class="keywordflow">return</font> 0; +00207 <font class="keywordflow">break</font>; +00208 } +00209 } +00210 <font class="keywordflow">else</font> +00211 { +00212 <font class="keywordflow">switch</font>(comp) +00213 { +00214 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s0">CVPSwizzle::X</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a320">GL_NEGATIVE_X_EXT</a>; +00215 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s1">CVPSwizzle::Y</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a321">GL_NEGATIVE_Y_EXT</a>; +00216 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s2">CVPSwizzle::Z</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a322">GL_NEGATIVE_Z_EXT</a>; +00217 <font class="keywordflow">case</font> <a class="code" href="structCVPSwizzle.html#s4s3">CVPSwizzle::W</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a323">GL_NEGATIVE_W_EXT</a>; +00218 <font class="keywordflow">default</font>: +00219 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00220 <font class="keywordflow">return</font> 0; +00221 <font class="keywordflow">break</font>; +00222 } +00223 } +00224 } +00225 +00226 <font class="comment">// ***************************************************************************</font> +00229 <font class="comment"></font><font class="keyword">static</font> <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="namespaceNL3D.html#a356">convOutputRegisterToEXTVertexShader</a>(<a class="code" href="structCVPOperand.html#s42">CVPOperand::EOutputRegister</a> <a class="code" href="driver__opengl__extension__def_8h.html#a385">r</a>) +00230 { +00231 <font class="keywordflow">switch</font> (r) +00232 { +00233 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s24">CVPOperand::OHPosition</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a256">GL_OUTPUT_VERTEX_EXT</a>; +00234 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s25">CVPOperand::OPrimaryColor</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a257">GL_OUTPUT_COLOR0_EXT</a>; +00235 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s26">CVPOperand::OSecondaryColor</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a258">GL_OUTPUT_COLOR1_EXT</a>; +00236 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s27">CVPOperand::OBackFacePrimaryColor</a>: +00237 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Backface color used in a vertex program is not supported by device, defaulting to front color"</font>); +00238 <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a257">GL_OUTPUT_COLOR0_EXT</a>; +00239 <font class="keywordflow">break</font>; +00240 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s28">CVPOperand::OBackFaceSecondaryColor</a>: +00241 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Backface color used in a vertex program is not supported by device, defaulting to front color"</font>); +00242 <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a258">GL_OUTPUT_COLOR1_EXT</a>; +00243 <font class="keywordflow">break</font>; +00244 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s29">CVPOperand::OFogCoord</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a291">GL_OUTPUT_FOG_EXT</a>; +00245 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s30">CVPOperand::OPointSize</a>: <a class="code" href="debug_8h.html#a12">nlstop</a>; <font class="keywordflow">return</font> 0; <font class="comment">// sorry, not supported</font> +00246 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s31">CVPOperand::OTex0</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a259">GL_OUTPUT_TEXTURE_COORD0_EXT</a>; +00247 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s32">CVPOperand::OTex1</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a260">GL_OUTPUT_TEXTURE_COORD1_EXT</a>; +00248 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s33">CVPOperand::OTex2</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a261">GL_OUTPUT_TEXTURE_COORD2_EXT</a>; +00249 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s34">CVPOperand::OTex3</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a262">GL_OUTPUT_TEXTURE_COORD3_EXT</a>; +00250 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s35">CVPOperand::OTex4</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a263">GL_OUTPUT_TEXTURE_COORD4_EXT</a>; +00251 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s36">CVPOperand::OTex5</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a264">GL_OUTPUT_TEXTURE_COORD5_EXT</a>; +00252 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s37">CVPOperand::OTex6</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a265">GL_OUTPUT_TEXTURE_COORD6_EXT</a>; +00253 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s42s38">CVPOperand::OTex7</a>: <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a266">GL_OUTPUT_TEXTURE_COORD7_EXT</a>; +00254 <font class="keywordflow">default</font>: +00255 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00256 <font class="keywordflow">break</font>; +00257 } +00258 <font class="keywordflow">return</font> 0; +00259 } +00260 +00261 <font class="comment">// ***************************************************************************</font> +00264 <font class="comment"></font><font class="keyword">static</font> uint <a class="code" href="namespaceNL3D.html#a357">convInputRegisterToVBFlag</a>(uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +00265 { +00266 <font class="keywordflow">switch</font> (index) +00267 { +00268 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s6">CVPOperand::IPosition</a>: <font class="keywordflow">return</font> CVertexBuffer::PositionFlag; +00269 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s7">CVPOperand::IWeight</a>: <font class="keywordflow">return</font> CVertexBuffer::WeightFlag; +00270 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s8">CVPOperand::INormal</a>: <font class="keywordflow">return</font> CVertexBuffer::NormalFlag; +00271 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s9">CVPOperand::IPrimaryColor</a>: <font class="keywordflow">return</font> CVertexBuffer::PrimaryColorFlag; +00272 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s10">CVPOperand::ISecondaryColor</a>: <font class="keywordflow">return</font> CVertexBuffer::SecondaryColorFlag; +00273 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s11">CVPOperand::IFogCoord</a>: <font class="keywordflow">return</font> CVertexBuffer::FogFlag; +00274 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s12">CVPOperand::IPaletteSkin</a>: <font class="keywordflow">return</font> CVertexBuffer::PaletteSkinFlag; +00275 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s13">CVPOperand::IEmpty</a>: <a class="code" href="debug_8h.html#a6">nlassert</a>(0); <font class="keywordflow">break</font>; +00276 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s14">CVPOperand::ITex0</a>: +00277 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s15">CVPOperand::ITex1</a>: +00278 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s16">CVPOperand::ITex2</a>: +00279 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s17">CVPOperand::ITex3</a>: +00280 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s18">CVPOperand::ITex4</a>: +00281 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s19">CVPOperand::ITex5</a>: +00282 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s20">CVPOperand::ITex6</a>: +00283 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s21">CVPOperand::ITex7</a>: +00284 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s41s22">CVPOperand::ITex8</a>: +00285 <font class="keywordflow">return</font> CVertexBuffer::TexCoord0Flag << (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> - <a class="code" href="structCVPOperand.html#s41s14">CVPOperand::ITex0</a>); +00286 <font class="keywordflow">default</font>: +00287 <a class="code" href="debug_8h.html#a6">nlassert</a>(0); +00288 <font class="keywordflow">break</font>; +00289 } +00290 <font class="keywordflow">return</font> 0; +00291 } +00292 +00293 +00294 +00295 <font class="comment">// A macro to debug the generated instruction</font> +<a name="l00296"></a><a class="code" href="driver__opengl__vertex__program_8cpp.html#a0">00296</a> <font class="preprocessor">#define DEBUG_SETUP_EXT_VERTEX_SHADER</font> +00297 <font class="preprocessor"></font> +00298 <font class="preprocessor">#ifdef DEBUG_SETUP_EXT_VERTEX_SHADER</font> +<a name="l00299"></a><a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">00299</a> <font class="preprocessor"></font><font class="preprocessor"> #define EVS_INFO(what) nlinfo(what)</font> +00300 <font class="preprocessor"></font><font class="preprocessor">#else</font> +00301 <font class="preprocessor"></font><font class="preprocessor"> #define EVS_INFO(what)</font> +00302 <font class="preprocessor"></font><font class="preprocessor">#endif</font> +00303 <font class="preprocessor"></font> +00304 +00305 <font class="comment">// For debugging with swizzling</font> +00306 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a404">in</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a>) +00307 { +00308 <a class="code" href="driver__opengl__extension_8h.html#a124">nglSwizzleEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a404">in</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a>); +00309 <font class="preprocessor">#ifdef DEBUG_SETUP_EXT_VERTEX_SHADER</font> +00310 <font class="preprocessor"></font> std::string swzStr = <font class="stringliteral">"Swizzle : "</font>; +00311 GLenum swz[] = { <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a> }; +00312 <font class="keywordflow">for</font>(uint k = 0; k < 4; ++k) +00313 { +00314 <font class="keywordflow">switch</font>(swz[k]) +00315 { +00316 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>: +00317 swzStr +=<font class="stringliteral">" X"</font>; +00318 <font class="keywordflow">break</font>; +00319 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a320">GL_NEGATIVE_X_EXT</a>: +00320 swzStr +=<font class="stringliteral">" -X"</font>; +00321 <font class="keywordflow">break</font>; +00322 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>: +00323 swzStr +=<font class="stringliteral">" Y"</font>; +00324 <font class="keywordflow">break</font>; +00325 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a321">GL_NEGATIVE_Y_EXT</a>: +00326 swzStr +=<font class="stringliteral">" -Y"</font>; +00327 <font class="keywordflow">break</font>; +00328 <font class="keywordflow">break</font>; +00329 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a>: +00330 swzStr +=<font class="stringliteral">" Z"</font>; +00331 <font class="keywordflow">break</font>; +00332 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a322">GL_NEGATIVE_Z_EXT</a>: +00333 swzStr +=<font class="stringliteral">" -Z"</font>; +00334 <font class="keywordflow">break</font>; +00335 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a>: +00336 swzStr +=<font class="stringliteral">" W"</font>; +00337 <font class="keywordflow">break</font>; +00338 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a323">GL_NEGATIVE_W_EXT</a>: +00339 swzStr +=<font class="stringliteral">" -W"</font>; +00340 <font class="keywordflow">break</font>; +00341 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>: +00342 swzStr +=<font class="stringliteral">"0"</font>; +00343 <font class="keywordflow">break</font>; +00344 <font class="keywordflow">case</font> <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>: +00345 swzStr +=<font class="stringliteral">"1"</font>; +00346 <font class="keywordflow">break</font>; +00347 } +00348 } +00349 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(swzStr.c_str()); +00350 <font class="preprocessor">#endif</font> +00351 <font class="preprocessor"></font> +00352 } +00353 +00354 <font class="comment">// Perform write mask and output de bug informations</font> +00355 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a404">in</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a>, GLenum <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a>) +00356 { +00357 <a class="code" href="driver__opengl__extension_8h.html#a125">nglWriteMaskEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a404">in</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a>); +00358 <font class="preprocessor"> #ifdef DEBUG_SETUP_EXT_VERTEX_SHADER</font> +00359 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"Write Mask : %c%c%c%c"</font>, +00360 <a class="code" href="driver__opengl__extension__def_8h.html#a405">outX</a> ? <font class="charliteral">'x'</font> : <font class="charliteral">'-'</font>, +00361 <a class="code" href="driver__opengl__extension__def_8h.html#a406">outY</a> ? <font class="charliteral">'y'</font> : <font class="charliteral">'-'</font>, +00362 <a class="code" href="driver__opengl__extension__def_8h.html#a407">outZ</a> ? <font class="charliteral">'z'</font> : <font class="charliteral">'-'</font>, +00363 <a class="code" href="driver__opengl__extension__def_8h.html#a408">outW</a> ? <font class="charliteral">'w'</font> : <font class="charliteral">'-'</font> +00364 ); +00365 <font class="preprocessor"> #endif</font> +00366 <font class="preprocessor"></font>} +00367 +00368 <font class="comment">// ***************************************************************************</font> +<a name="l00371"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z417_1">00371</a> <font class="comment"></font><font class="keywordtype">bool</font> CDriverGL::setupEXTVertexShader(<font class="keyword">const</font> <a class="code" href="classCVPParser.html#s0">CVPParser::TProgram</a> &<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>, uint variants[EVSNumVariants], uint16 &usedInputRegisters) +00372 { +00373 <font class="comment">// counter to see what is generated</font> +00374 uint numOp = 0; +00375 uint numOpIndex = 0; +00376 uint numSwizzle = 0; +00377 uint numEC = 0; <font class="comment">// extract component</font> +00378 uint numIC = 0; <font class="comment">// insert component</font> +00379 uint numWM = 0; <font class="comment">// write maks</font> +00380 +00381 +00382 <font class="preprocessor"> #ifdef DEBUG_SETUP_EXT_VERTEX_SHADER</font> +00383 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"**********************************************************"</font>); +00384 <font class="preprocessor"> #endif</font> +00385 <font class="preprocessor"></font> +00386 <font class="comment">// clear last error</font> +00387 GLenum glError = glGetError(); +00388 +00389 <font class="comment">// allocate the symbols</font> +00390 <a class="code" href="driver__opengl__extension_8h.html#a118">nglBindVertexShaderEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>); +00391 <a class="code" href="driver__opengl__extension_8h.html#a116">nglBeginVertexShaderEXT</a>(); +00392 { +00393 <font class="comment">// Allocate register and variant</font> +00394 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> firstRegister = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a298">GL_LOCAL_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 12); <font class="comment">// 12 register</font> +00395 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> firstTempRegister = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a298">GL_LOCAL_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 4); <font class="comment">// 4 temp register used for swizzle & indexing</font> +00396 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> firstTempScalar = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a292">GL_SCALAR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a298">GL_LOCAL_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 3); <font class="comment">// 3 temp scalars used for EXPP & LOGG emulation</font> +00397 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> firstAddressRegister = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a292">GL_SCALAR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a298">GL_LOCAL_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00398 +00399 <font class="comment">// allocate variants</font> +00400 variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s1">EVSSecondaryColorVariant</a>] = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a295">GL_VARIANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a327">GL_NORMALIZED_RANGE_EXT</a>, 1); +00401 variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s2">EVSFogCoordsVariant</a>] = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a295">GL_VARIANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00402 variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s3">EVSSkinWeightVariant</a>] = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a295">GL_VARIANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a327">GL_NORMALIZED_RANGE_EXT</a>, 1); +00403 variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s4">EVSPaletteSkinVariant</a>] = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a295">GL_VARIANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00404 +00405 <font class="comment">// allocate one temporary register for fog before conversion</font> +00406 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> fogTemp = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a293">GL_VECTOR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a298">GL_LOCAL_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00407 +00408 +00409 <font class="comment">// local constant : 0 and 1</font> +00410 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> cteOne = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a292">GL_SCALAR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a297">GL_LOCAL_CONSTANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00411 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> cteZero = <a class="code" href="driver__opengl__extension_8h.html#a128">nglGenSymbolsEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a292">GL_SCALAR_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a297">GL_LOCAL_CONSTANT_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a328">GL_FULL_RANGE_EXT</a>, 1); +00412 +00413 +00414 <font class="keywordtype">float</font> oneValue = 1.f; +00415 <font class="keywordtype">float</font> zeroValue = 0.f; +00416 +00417 <a class="code" href="driver__opengl__extension_8h.html#a130">nglSetLocalConstantEXT</a>( cteOne, GL_FLOAT, &oneValue); +00418 <a class="code" href="driver__opengl__extension_8h.html#a130">nglSetLocalConstantEXT</a>( cteZero, GL_FLOAT, &zeroValue); +00419 +00420 +00421 +00422 <font class="keywordflow">if</font> (firstRegister == 0) +00423 { +00424 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to allocate local registers for EXT_vertex_shader"</font>); +00425 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00426 } +00427 <font class="keywordflow">if</font> (firstTempRegister == 0) +00428 { +00429 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to allocate local temp registers for EXT_vertex_shader"</font>); +00430 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00431 } +00432 <font class="keywordflow">if</font> (firstTempScalar == 0) +00433 { +00434 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to allocate temp scalar registers for EXT_vertex_shader"</font>); +00435 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00436 } +00437 <font class="keywordflow">if</font> (firstAddressRegister == 0) +00438 { +00439 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to allocate address register for EXT_vertex_shader"</font>); +00440 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00441 } +00442 +00443 uint k; +00444 <font class="keywordflow">for</font>(k = 0; k < <a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s5">EVSNumVariants</a>; ++k) +00445 { +00446 <font class="keywordflow">if</font> (variants[k] == 0) +00447 { +00448 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to allocate variants for EXT_vertex_shader"</font>); +00449 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00450 } +00451 } +00452 +00453 <font class="comment">// Mask of output component that are being written</font> +00454 uint componentWritten[16]; +00455 std::fill(componentWritten, componentWritten + 16, 0); +00456 +00457 <font class="comment">//</font> +00458 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> srcValue[3]; +00459 <font class="comment">//</font> +00460 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> destValue; +00461 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> maskedDestValue; +00462 +00463 +00464 uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +00465 <font class="comment">// convert each instruction of the vertex program</font> +00466 <font class="keywordflow">for</font>(k = 0; k < <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>.size(); ++k) +00467 { +00468 <font class="comment">// get src values, eventually applying swizzle, negate, and index on them</font> +00469 uint numSrc = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>[k].getNumUsedSrc(); +00470 <font class="keywordflow">for</font>(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < numSrc; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00471 { +00472 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>((<font class="stringliteral">"Build source "</font> + toString(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)).c_str()); +00473 <font class="keyword">const</font> <a class="code" href="structCVPOperand.html">CVPOperand</a> &operand = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>[k].getSrc(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>); +00474 <font class="keywordflow">switch</font> (operand.<a class="code" href="structCVPOperand.html#m0">Type</a>) +00475 { +00476 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s2">CVPOperand::InputRegister</a>: +00477 { +00478 <font class="keywordflow">switch</font>(operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.InputRegisterValue) +00479 { +00480 <font class="keywordflow">case</font> 0: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = <a class="code" href="classNL3D_1_1CDriverGL.html#z417_2">_EVSPositionHandle</a>; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = position"</font>); <font class="keywordflow">break</font>; +00481 <font class="keywordflow">case</font> 1: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s3">EVSSkinWeightVariant</a>]; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = skin weight"</font>); <font class="keywordflow">break</font>; +00482 <font class="keywordflow">case</font> 2: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = <a class="code" href="classNL3D_1_1CDriverGL.html#z417_3">_EVSNormalHandle</a>; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = normal"</font>); <font class="keywordflow">break</font>; +00483 <font class="keywordflow">case</font> 3: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = <a class="code" href="classNL3D_1_1CDriverGL.html#z417_4">_EVSColorHandle</a>; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = color 0"</font>); <font class="keywordflow">break</font>; +00484 <font class="keywordflow">case</font> 4: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s1">EVSSecondaryColorVariant</a>]; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = color 1"</font>); <font class="keywordflow">break</font>; +00485 <font class="keywordflow">case</font> 5: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s2">EVSFogCoordsVariant</a>]; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = fog coord"</font>); <font class="keywordflow">break</font>; +00486 <font class="keywordflow">case</font> 6: srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = variants[<a class="code" href="classNL3D_1_1CDriverGL.html#z417_0s4">EVSPaletteSkinVariant</a>]; <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Src = palette skin"</font>); <font class="keywordflow">break</font>; +00487 <font class="keywordflow">case</font> 7: <a class="code" href="debug_8h.html#a12">nlstop</a>; <font class="comment">// not supported</font> +00488 <font class="keywordflow">case</font> 8: +00489 <font class="keywordflow">case</font> 9: +00490 <font class="keywordflow">case</font> 10: +00491 <font class="keywordflow">case</font> 11: +00492 <font class="keywordflow">case</font> 12: +00493 <font class="keywordflow">case</font> 13: +00494 <font class="keywordflow">case</font> 14: +00495 <font class="keywordflow">case</font> 15: +00496 { +00497 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>((<font class="stringliteral">"Src = Tex"</font> + toString(operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.InputRegisterValue - 8)).c_str()); +00498 srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = <a class="code" href="classNL3D_1_1CDriverGL.html#z417_5">_EVSTexHandle</a>[operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.InputRegisterValue - 8]; +00499 <font class="keywordflow">if</font> (srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] == 0) +00500 { +00501 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Trying to read an unaccessible texture coords for the device when using EXT_vertex_shader, shader loading failed"</font>); +00502 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00503 } +00504 } +00505 <font class="keywordflow">break</font>; +00506 <font class="keywordflow">default</font>: +00507 <a class="code" href="debug_8h.html#a12">nlstop</a>; <font class="comment">// invalid value</font> +00508 <font class="keywordflow">break</font>; +00509 } +00510 } +00511 <font class="keywordflow">break</font>; +00512 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s1">CVPOperand::Constant</a>: +00513 srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = <a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.ConstantValue; +00514 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>((<font class="stringliteral">"Src = constant"</font> + toString(operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.ConstantValue)).c_str()); +00515 <font class="keywordflow">break</font>; +00516 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s0">CVPOperand::Variable</a>: +00517 srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = firstRegister + operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.VariableValue; +00518 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>((<font class="stringliteral">"Src = variable register"</font> + toString(operand.<a class="code" href="structCVPOperand.html#m5">Value</a>.VariableValue)).c_str()); +00519 <font class="keywordflow">break</font>; +00520 <font class="keywordflow">default</font>: +00521 <a class="code" href="debug_8h.html#a6">nlassert</a>(0); +00522 <font class="keywordflow">break</font>; +00523 } +00524 <font class="comment">// test if indexed access is used (can be used on one register only)</font> +00525 <font class="keywordflow">if</font> (operand.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s1">CVPOperand::Constant</a> && operand.<a class="code" href="structCVPOperand.html#m6">Indexed</a>) +00526 { +00527 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a232">GL_OP_INDEX_EXT</a>, firstTempRegister + 3, firstAddressRegister, srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>]); +00528 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_INDEX_EXT"</font>); +00529 ++ numOpIndex; +00530 srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = firstTempRegister + 3; +00531 glError = glGetError(); +00532 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR) +00533 } +00534 +00535 <font class="comment">// test if swizzle or negate is used</font> +00536 <font class="keywordflow">if</font> (!operand.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a1">isIdentity</a>() || operand.<a class="code" href="structCVPOperand.html#m8">Negate</a>) +00537 { +00538 <font class="comment">// if the instruction reads a scalar, no need for swizzle (except if negate is used)</font> +00539 <font class="keywordflow">if</font> (! +00540 ( +00541 (program[k].Opcode == <a class="code" href="structCVPInstruction.html#s18s5">CVPInstruction::RSQ</a> +00542 || program[k].Opcode == <a class="code" href="structCVPInstruction.html#s18s16">CVPInstruction::RCP</a> +00543 || program[k].Opcode == <a class="code" href="structCVPInstruction.html#s18s15">CVPInstruction::LOG</a> +00544 || program[k].Opcode == <a class="code" href="structCVPInstruction.html#s18s14">CVPInstruction::EXPP</a> +00545 ) +00546 && +00547 !operand.<a class="code" href="structCVPOperand.html#m8">Negate</a> +00548 ) +00549 ) +00550 { +00551 <font class="comment">// need a temp register for swizzle and/or negate</font> +00552 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister + <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>, srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>], +00553 <a class="code" href="namespaceNL3D.html#a355">convSwizzleToGLFormat</a>(operand.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0], operand.<a class="code" href="structCVPOperand.html#m8">Negate</a>), +00554 <a class="code" href="namespaceNL3D.html#a355">convSwizzleToGLFormat</a>(operand.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[1], operand.<a class="code" href="structCVPOperand.html#m8">Negate</a>), +00555 <a class="code" href="namespaceNL3D.html#a355">convSwizzleToGLFormat</a>(operand.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[2], operand.<a class="code" href="structCVPOperand.html#m8">Negate</a>), +00556 <a class="code" href="namespaceNL3D.html#a355">convSwizzleToGLFormat</a>(operand.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[3], operand.<a class="code" href="structCVPOperand.html#m8">Negate</a>)); +00557 ++numSwizzle; +00558 srcValue[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] = firstTempRegister + <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +00559 glError = glGetError(); +00560 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR) +00561 } +00562 } +00563 } +00564 +00565 <font class="comment">// get dest value</font> +00566 <font class="keyword">const</font> <a class="code" href="structCVPOperand.html">CVPOperand</a> &destOperand = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>[k].Dest; +00567 <font class="keywordflow">switch</font>(destOperand.<a class="code" href="structCVPOperand.html#m0">Type</a>) +00568 { +00569 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s0">CVPOperand::Variable</a>: +00570 destValue = firstRegister + destOperand.<a class="code" href="structCVPOperand.html#m5">Value</a>.VariableValue; +00571 <font class="keywordflow">break</font>; +00572 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a>: +00573 <font class="keywordflow">if</font> (destOperand.<a class="code" href="structCVPOperand.html#m5">Value</a>.OutputRegisterValue != <a class="code" href="structCVPOperand.html#s42s29">CVPOperand::OFogCoord</a>) +00574 { +00575 destValue = <a class="code" href="namespaceNL3D.html#a356">convOutputRegisterToEXTVertexShader</a>(destOperand.<a class="code" href="structCVPOperand.html#m5">Value</a>.OutputRegisterValue); +00576 } +00577 <font class="keywordflow">else</font> +00578 { +00579 destValue = fogTemp; +00580 } +00581 <font class="keywordflow">break</font>; +00582 <font class="keywordflow">case</font> <a class="code" href="structCVPOperand.html#s40s4">CVPOperand::AddressRegister</a>: +00583 destValue = firstAddressRegister; +00584 <font class="keywordflow">break</font>; +00585 <font class="keywordflow">default</font>: +00586 <a class="code" href="debug_8h.html#a6">nlassert</a>(0); +00587 <font class="keywordflow">break</font>; +00588 } +00589 +00590 uint writeMask = program[k].Dest.<a class="code" href="structCVPOperand.html#m7">WriteMask</a>; +00591 <a class="code" href="structCVPInstruction.html#s18">CVPInstruction::EOpcode</a> opcode = program[k].Opcode; +00592 uint outputRegisterIndex = destOperand.<a class="code" href="structCVPOperand.html#m5">Value</a>.OutputRegisterValue; +00593 <a class="code" href="debug_8h.html#a6">nlassert</a>(outputRegisterIndex < 16); +00594 +00595 <font class="comment">// Tells wether the output has already been written before the final write mask. This happens with instructions LOG, EXPP, LIT, RSQ and RCP,</font> +00596 <font class="comment">// because they write their output component by components</font> +00597 <font class="keywordtype">bool</font> outputWritten = <font class="keyword">false</font>; +00598 +00599 <font class="comment">// test for write mask </font> +00600 <font class="keywordflow">if</font> (writeMask != 0x0f) +00601 { +00605 <font class="keywordflow">if</font> (!(destOperand.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a> && destValue == fogTemp)) +00606 { +00607 <font class="comment">// For instructions that write their output components by components, we don't need an intermediary register</font> +00608 <font class="keywordflow">if</font> (opcode == <a class="code" href="structCVPInstruction.html#s18s15">CVPInstruction::LOG</a> +00609 || opcode == <a class="code" href="structCVPInstruction.html#s18s14">CVPInstruction::EXPP</a> +00610 || opcode == <a class="code" href="structCVPInstruction.html#s18s9">CVPInstruction::LIT</a> +00611 || opcode == <a class="code" href="structCVPInstruction.html#s18s5">CVPInstruction::RSQ</a> +00612 || opcode == <a class="code" href="structCVPInstruction.html#s18s16">CVPInstruction::RCP</a> +00613 ) +00614 { +00615 outputWritten = <font class="keyword">true</font>; +00616 } +00617 <font class="keywordflow">else</font> +00618 { +00619 maskedDestValue = destValue; +00620 <font class="comment">// use a temp register before masking</font> +00621 destValue = firstTempRegister; +00622 } +00623 } +00624 <font class="keywordflow">else</font> +00625 { +00626 componentWritten[outputRegisterIndex] = 0xf; +00627 } +00628 } +00629 <font class="keywordflow">else</font> +00630 { +00631 <font class="keywordflow">if</font> (destOperand.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a>) +00632 { +00633 componentWritten[outputRegisterIndex] = 0xf; <font class="comment">// say all components have been written for that output </font> +00634 } +00635 } +00636 +00637 <font class="comment">// generate opcode</font> +00638 <font class="keywordflow">switch</font> (opcode) +00639 { +00640 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s1">CVPInstruction::ARL</a>: +00641 { +00642 <a class="code" href="debug_8h.html#a6">nlassert</a>(program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a0">isScalar</a>()); +00643 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0]; +00644 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstAddressRegister, srcValue[0], <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00645 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00646 ++numEC; +00647 } +00648 <font class="keywordflow">break</font>; +00649 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s0">CVPInstruction::MOV</a>: +00650 { +00651 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a255">GL_OP_MOV_EXT</a>, destValue, srcValue[0]); +00652 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MOV_EXT"</font>); +00653 ++numOp; +00654 } +00655 <font class="keywordflow">break</font>; +00656 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s2">CVPInstruction::MUL</a>: +00657 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a236">GL_OP_MUL_EXT</a>, destValue, srcValue[0], srcValue[1]); +00658 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MUL_EXT"</font>); +00659 ++numOp; +00660 <font class="keywordflow">break</font>; +00661 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s3">CVPInstruction::ADD</a>: +00662 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a237">GL_OP_ADD_EXT</a>, destValue, srcValue[0], srcValue[1]); +00663 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_ADD_EXT"</font>); +00664 ++numOp; +00665 <font class="keywordflow">break</font>; +00666 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s4">CVPInstruction::MAD</a>: +00667 <a class="code" href="driver__opengl__extension_8h.html#a123">nglShaderOp3EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a238">GL_OP_MADD_EXT</a>, destValue, srcValue[0], srcValue[1], srcValue[2]); +00668 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MADD_EXT"</font>); +00669 ++numOp; +00670 <font class="keywordflow">break</font>; +00671 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s5">CVPInstruction::RSQ</a>: +00672 { +00673 <a class="code" href="debug_8h.html#a6">nlassert</a>(program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a0">isScalar</a>()); +00674 <font class="comment">// extract the component we need</font> +00675 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0]; +00676 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar, srcValue[0], <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>); +00677 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00678 ++numEC; +00679 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a251">GL_OP_RECIP_SQRT_EXT</a>, firstTempScalar + 1, firstTempScalar); +00680 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_RECIP_SQRT_EXT"</font>); +00681 ++numOp; +00682 <font class="comment">// duplicate result in destination</font> +00683 <font class="keywordflow">for</font>(uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < 4; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00684 { +00685 <font class="keywordflow">if</font> (writeMask & (1 << <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)) +00686 { +00687 <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar + 1, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>); +00688 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); +00689 <a class="code" href="debug_8h.html#a6">nlassert</a>(glGetError() == GL_NO_ERROR); +00690 } +00691 } +00692 } +00693 <font class="keywordflow">break</font>; +00694 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s6">CVPInstruction::DP3</a>: +00695 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a234">GL_OP_DOT3_EXT</a>, destValue, srcValue[0], srcValue[1]); +00696 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_DOT3_EXT"</font>); +00697 ++numOp; +00698 <font class="keywordflow">break</font>; +00699 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s7">CVPInstruction::DP4</a>: +00700 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a235">GL_OP_DOT4_EXT</a>, destValue, srcValue[0], srcValue[1]); +00701 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_DOT4_EXT"</font>); +00702 ++numOp; +00703 <font class="keywordflow">break</font>; +00704 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s8">CVPInstruction::DST</a>: +00705 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister, srcValue[0], <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); +00706 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_DOT4_EXT"</font>); +00707 ++numOp; +00708 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister + 1, srcValue[1], <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a>); +00709 ++numSwizzle; +00710 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a236">GL_OP_MUL_EXT</a>, destValue, firstTempRegister, firstTempRegister + 1); +00711 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MUL_EXT"</font>); +00712 ++numOp; +00713 <font class="keywordflow">break</font>; +00714 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s9">CVPInstruction::LIT</a>: +00715 { +00716 uint writeMask = program[k].Dest.<a class="code" href="structCVPOperand.html#m7">WriteMask</a>; +00717 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar, srcValue[0], 0); <font class="comment">// extract X from the source</font> +00718 <font class="keywordflow">if</font> (writeMask & 4) +00719 { +00720 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar + 1, srcValue[0], 1); <font class="comment">// extract Y from the source</font> +00721 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00722 ++numEC; +00723 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar + 2, srcValue[0], 3); <font class="comment">// extract W from the source</font> +00724 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00725 ++numEC; +00726 <font class="comment">// result = X > 0 ? Y^W : 0 </font> +00727 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a249">GL_OP_POWER_EXT</a>, firstTempScalar + 2, firstTempScalar + 1, firstTempScalar + 2); +00728 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_POWER_EXT"</font>); +00729 ++numOp; +00730 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a242">GL_OP_SET_GE_EXT</a>, firstTempScalar + 1, firstTempScalar, cteZero); +00731 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_SET_GE_EXT"</font>); +00732 ++numOp; +00733 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a236">GL_OP_MUL_EXT</a>, firstTempScalar + 2, firstTempScalar + 2, firstTempScalar + 1); +00734 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MUL_EXT"</font>); +00735 ++numOp; +00736 <font class="comment">// store result</font> +00737 <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar + 2, 2); +00738 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); +00739 ++numIC; +00740 } +00741 <font class="keywordflow">if</font> (writeMask & 2) +00742 { +00743 <font class="comment">// clamp N.L to [0, 1]</font> +00744 <a class="code" href="driver__opengl__extension_8h.html#a123">nglShaderOp3EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a244">GL_OP_CLAMP_EXT</a>, firstTempScalar, firstTempScalar, cteZero, cteOne); +00745 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_CLAMP_EXT"</font>); +00746 ++numOp; +00747 <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar, 1); +00748 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); +00749 ++numIC; +00750 } +00751 <font class="comment">// set x and w to 1 if they are not masked</font> +00752 <font class="keywordflow">if</font> (writeMask & (1 + 8)) +00753 { +00754 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(destValue, destValue, +00755 (writeMask & 1) ? <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>, +00756 <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, +00757 <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a>, +00758 (writeMask & 8) ? <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a>); +00759 ++numSwizzle; +00760 } +00761 +00762 } +00763 <font class="keywordflow">break</font>; +00764 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s10">CVPInstruction::MIN</a>: +00765 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a241">GL_OP_MIN_EXT</a>, destValue, srcValue[0], srcValue[1]); +00766 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MIN_EXT"</font>); +00767 ++numOp; +00768 <font class="keywordflow">break</font>; +00769 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s11">CVPInstruction::MAX</a>: +00770 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a240">GL_OP_MAX_EXT</a>, destValue, srcValue[0], srcValue[1]); +00771 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MAX_EXT"</font>); +00772 ++numOp; +00773 <font class="keywordflow">break</font>; +00774 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s12">CVPInstruction::SLT</a>: +00775 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a243">GL_OP_SET_LT_EXT</a>, destValue, srcValue[0], srcValue[1]); +00776 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_SET_LT_EXT"</font>); +00777 ++numOp; +00778 <font class="keywordflow">break</font>; +00779 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s13">CVPInstruction::SGE</a>: +00780 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a242">GL_OP_SET_GE_EXT</a>, destValue, srcValue[0], srcValue[1]); +00781 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_SET_GE_EXT"</font>); +00782 ++numOp; +00783 <font class="keywordflow">break</font>; +00784 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s14">CVPInstruction::EXPP</a>: +00785 { +00786 uint writeMask = program[k].Dest.<a class="code" href="structCVPOperand.html#m7">WriteMask</a>; +00787 <a class="code" href="debug_8h.html#a6">nlassert</a>(program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a0">isScalar</a>()); +00788 <a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a> compIndex = program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0]; +00789 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar + 2, srcValue[0], compIndex); <font class="comment">// extract W from the source</font> +00790 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00791 ++numEC; +00792 <font class="keywordflow">if</font> (writeMask & 1) +00793 { +00794 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a245">GL_OP_FLOOR_EXT</a>, firstTempScalar, firstTempScalar + 2); <font class="comment">// (int) W</font> +00795 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_FLOOR_EXT"</font>); +00796 ++numOp; +00797 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a247">GL_OP_EXP_BASE_2_EXT</a>, firstTempScalar, firstTempScalar); <font class="comment">// 2 ^ (int) W </font> +00798 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_EXP_BASE_2_EXT"</font>); +00799 ++numOp; +00800 } +00801 <font class="keywordflow">if</font> (writeMask & 2) +00802 { +00803 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a239">GL_OP_FRAC_EXT</a>, firstTempScalar + 1, firstTempScalar + 2); <font class="comment">// frac(W)</font> +00804 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_FRAC_EXT"</font>); +00805 ++numOp; +00806 } +00807 <font class="keywordflow">if</font> (writeMask & 4) <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a247">GL_OP_EXP_BASE_2_EXT</a>, firstTempScalar + 2, firstTempScalar + 2); <font class="comment">// 2 ^W</font> +00808 <font class="comment">// store the results</font> +00809 <font class="keywordflow">if</font> (writeMask & 1) { <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar, 0); <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); ++numIC; } +00810 <font class="keywordflow">if</font> (writeMask & 2) { <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar + 1, 1); <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); ++numIC; } +00811 <font class="keywordflow">if</font> (writeMask & 4) { <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar + 2, 2); <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); ++numIC; } +00812 <font class="comment">// set W to 1 and leave other values unchanged</font> +00813 <font class="keywordflow">if</font> (writeMask & 8) { <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(destValue, destValue, <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); ++numSwizzle; } +00814 } +00815 <font class="keywordflow">break</font>; +00816 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s15">CVPInstruction::LOG</a>: +00817 { +00818 uint writeMask = program[k].Dest.<a class="code" href="structCVPOperand.html#m7">WriteMask</a>; +00819 <a class="code" href="debug_8h.html#a6">nlassert</a>(program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a0">isScalar</a>()); +00820 <font class="comment">// extract the component we need</font> +00821 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar, srcValue[0], (<a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a>) program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0]); +00822 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00823 ++numEC; +00824 <font class="comment">// get abs(src) : abs(src) = max(src, -src)</font> +00825 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a233">GL_OP_NEGATE_EXT</a>, firstTempScalar + 1, firstTempScalar); +00826 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_NEGATE_EXT"</font>); +00827 ++numOp; +00828 <a class="code" href="driver__opengl__extension_8h.html#a122">nglShaderOp2EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a240">GL_OP_MAX_EXT</a>, firstTempScalar, firstTempScalar, firstTempScalar + 1); +00829 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_MAX_EXT"</font>); +00830 ++numOp; +00831 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a248">GL_OP_LOG_BASE_2_EXT</a>, firstTempScalar, firstTempScalar); <font class="comment">// (int) W</font> +00832 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_LOG_BASE_2_EXT"</font>); +00833 ++numOp; +00834 <font class="comment">// store the results</font> +00835 <font class="keywordflow">for</font>(uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < 4; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00836 { +00837 <font class="keywordflow">if</font> (writeMask & (1 << <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)) +00838 { +00839 <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>); +00840 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Insert component"</font>); +00841 <a class="code" href="debug_8h.html#a6">nlassert</a>(glGetError() == GL_NO_ERROR); +00842 } +00843 } +00844 } +00845 <font class="keywordflow">break</font>; +00846 <font class="keywordflow">case</font> <a class="code" href="structCVPInstruction.html#s18s16">CVPInstruction::RCP</a>: +00847 { +00848 uint writeMask = program[k].Dest.<a class="code" href="structCVPOperand.html#m7">WriteMask</a>; +00849 <a class="code" href="debug_8h.html#a6">nlassert</a>(program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#a0">isScalar</a>()); +00850 <font class="comment">// extract the component we need</font> +00851 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(firstTempScalar, srcValue[0], (<a class="code" href="driver__opengl__extension__def_8h.html#a423">GLuint</a>) program[k].Src1.<a class="code" href="structCVPOperand.html#m9">Swizzle</a>.<a class="code" href="structCVPSwizzle.html#m0">Comp</a>[0]); +00852 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component"</font>); +00853 ++numEC; +00854 <a class="code" href="driver__opengl__extension_8h.html#a121">nglShaderOp1EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a250">GL_OP_RECIP_EXT</a>, firstTempScalar + 1, firstTempScalar); +00855 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"GL_OP_RECIP_EXT"</font>); +00856 ++numOp; +00857 <font class="comment">// duplicate result in destination</font> +00858 <font class="keywordflow">for</font>(uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < 4; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +00859 { +00860 <font class="keywordflow">if</font> (writeMask & (1 << <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>)) +00861 { +00862 <a class="code" href="driver__opengl__extension_8h.html#a126">nglInsertComponentEXT</a>(destValue, firstTempScalar + 1, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>); +00863 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"insert component"</font>); +00864 ++numIC; +00865 } +00866 } +00867 } +00868 <font class="keywordflow">break</font>; +00869 } +00870 +00871 glError = glGetError(); +00872 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR) +00873 +00874 +00875 <font class="comment">// apply write mask if any</font> +00876 <font class="keywordflow">if</font> (writeMask != 0x0f) +00877 { +00878 <font class="keywordflow">if</font> (destOperand.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a> && destValue != fogTemp) +00879 { +00880 uint &outputMask = componentWritten[outputRegisterIndex]; +00881 <font class="comment">// is a texture coordinate or a color being written ?</font> +00882 <font class="keywordflow">if</font> ((maskedDestValue >= <a class="code" href="driver__opengl__extension__def_8h.html#a259">GL_OUTPUT_TEXTURE_COORD0_EXT</a> && maskedDestValue <= <a class="code" href="driver__opengl__extension__def_8h.html#a266">GL_OUTPUT_TEXTURE_COORD7_EXT</a>) +00883 || maskedDestValue == <a class="code" href="driver__opengl__extension__def_8h.html#a257">GL_OUTPUT_COLOR0_EXT</a> +00884 || maskedDestValue == <a class="code" href="driver__opengl__extension__def_8h.html#a258">GL_OUTPUT_COLOR1_EXT</a> +00885 ) +00886 { +00887 <font class="comment">// test if this is the last time this output will be written</font> +00888 <font class="keywordtype">bool</font> found = <font class="keyword">false</font>; +00889 <font class="comment">// if this was the last write for this output, must set unfilled component</font> +00890 <font class="comment">// NB : this loop could be optimized, but vertex program are rather short for now ..</font> +00891 <font class="keywordflow">for</font>(uint m = k + 1; m < program.size(); ++m) +00892 { +00893 <font class="keywordflow">if</font> (program[m].Dest.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a>) <font class="comment">// another output to this texture ?</font> +00894 { +00895 <font class="keywordflow">if</font> (program[m].Dest.<a class="code" href="structCVPOperand.html#m5">Value</a>.OutputRegisterValue == program[k].Dest.<a class="code" href="structCVPOperand.html#m5">Value</a>.OutputRegisterValue) +00896 { +00897 found = <font class="keyword">true</font>; +00898 <font class="keywordflow">break</font>; +00899 } +00900 } +00901 } +00902 +00903 <font class="keywordflow">if</font> (found) +00904 { +00905 <font class="keywordflow">if</font> (!outputWritten) +00906 { +00907 <font class="comment">// write values</font> +00908 <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(maskedDestValue, destValue, +00909 writeMask & 1 ? GL_TRUE : GL_FALSE, +00910 writeMask & 2 ? GL_TRUE : GL_FALSE, +00911 writeMask & 4 ? GL_TRUE : GL_FALSE, +00912 writeMask & 8 ? GL_TRUE : GL_FALSE); +00913 ++numWM; +00914 } +00915 } +00916 <font class="keywordflow">else</font> <font class="comment">// this is the last write, check if the mask is complete</font> +00917 { +00918 <font class="keywordflow">if</font> ((outputMask | writeMask) == 0xf) +00919 { +00920 <font class="keywordflow">if</font> (!outputWritten) +00921 { +00922 <font class="comment">// ok, after this call everything has been written</font> +00923 <font class="comment">// write values</font> +00924 <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(maskedDestValue, destValue, +00925 writeMask & 1 ? GL_TRUE : GL_FALSE, +00926 writeMask & 2 ? GL_TRUE : GL_FALSE, +00927 writeMask & 4 ? GL_TRUE : GL_FALSE, +00928 writeMask & 8 ? GL_TRUE : GL_FALSE); +00929 ++numWM; +00930 } +00931 } +00932 <font class="keywordflow">else</font> +00933 { +00934 uint prevMask = outputMask; +00935 uint newMask = writeMask | outputMask; +00936 +00937 <font class="comment">// complete unused entries</font> +00938 +00939 <font class="comment">// if primary color is output, then the default color is white</font> +00940 <font class="keywordflow">if</font> (maskedDestValue == <a class="code" href="driver__opengl__extension__def_8h.html#a257">GL_OUTPUT_COLOR0_EXT</a>) +00941 { +00942 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister, destValue, +00943 newMask & 1 ? <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, +00944 newMask & 2 ? <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, +00945 newMask & 4 ? <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, +00946 newMask & 8 ? <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); +00947 } +00948 <font class="keywordflow">else</font> +00949 { +00950 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister, destValue, +00951 newMask & 1 ? <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, +00952 newMask & 2 ? <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, +00953 newMask & 4 ? <a class="code" href="driver__opengl__extension__def_8h.html#a318">GL_Z_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, +00954 newMask & 8 ? <a class="code" href="driver__opengl__extension__def_8h.html#a319">GL_W_EXT</a> : <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); +00955 } +00956 <font class="keywordflow">if</font> (!outputWritten) +00957 { +00958 ++numWM; +00959 <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(maskedDestValue, firstTempRegister, +00960 prevMask & 1 ? GL_FALSE : GL_TRUE, +00961 prevMask & 2 ? GL_FALSE : GL_TRUE, +00962 prevMask & 4 ? GL_FALSE : GL_TRUE, +00963 prevMask & 8 ? GL_FALSE : GL_TRUE +00964 ); +00965 ++numWM; +00966 } +00967 outputMask = 0xf; +00968 } +00969 } +00970 } +00971 <font class="keywordflow">else</font> +00972 { +00973 <font class="keywordflow">if</font> (!outputWritten) +00974 { +00975 <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(maskedDestValue, destValue, +00976 writeMask & 1 ? GL_TRUE : GL_FALSE, +00977 writeMask & 2 ? GL_TRUE : GL_FALSE, +00978 writeMask & 4 ? GL_TRUE : GL_FALSE, +00979 writeMask & 8 ? GL_TRUE : GL_FALSE); +00980 ++numWM; +00981 } +00982 } +00983 <font class="comment">// complete the mask </font> +00984 outputMask |= writeMask; +00985 } +00986 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (destOperand.<a class="code" href="structCVPOperand.html#m0">Type</a> != <a class="code" href="structCVPOperand.html#s40s3">CVPOperand::OutputRegister</a>) +00987 { +00988 <font class="keywordflow">if</font> (!outputWritten) +00989 { +00990 <a class="code" href="namespaceNL3D.html#a359">doWriteMask</a>(maskedDestValue, destValue, +00991 writeMask & 1 ? GL_TRUE : GL_FALSE, +00992 writeMask & 2 ? GL_TRUE : GL_FALSE, +00993 writeMask & 4 ? GL_TRUE : GL_FALSE, +00994 writeMask & 8 ? GL_TRUE : GL_FALSE); +00995 ++numWM; +00996 } +00997 } +00998 } +00999 +01000 glError = glGetError(); +01001 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR) +01002 } +01003 +01004 +01005 +01006 <font class="comment">// if color have not been written, write with default values</font> +01007 <font class="keywordflow">if</font> (componentWritten[<a class="code" href="structCVPOperand.html#s42s25">CVPOperand::OPrimaryColor</a>] == 0) +01008 { +01009 <font class="comment">// we specify vertex coord has input for swizzle, but we don't read any component.. </font> +01010 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a257">GL_OUTPUT_COLOR0_EXT</a>, <a class="code" href="classNL3D_1_1CDriverGL.html#z417_2">_EVSPositionHandle</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); +01011 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Swizzle (Complete primary color)"</font>); +01012 ++numSwizzle; +01013 } +01014 <font class="keywordflow">else</font> +01015 { +01016 <a class="code" href="debug_8h.html#a6">nlassert</a>(componentWritten[<a class="code" href="structCVPOperand.html#s42s25">CVPOperand::OPrimaryColor</a>] == 0xf) +01017 } +01018 <font class="keywordflow">if</font> (componentWritten[<a class="code" href="structCVPOperand.html#s42s26">CVPOperand::OSecondaryColor</a>] == 0) +01019 { +01020 <font class="comment">// we specify vertex coord has input for swizzle, but we don't read any component..</font> +01021 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a258">GL_OUTPUT_COLOR1_EXT</a>, <a class="code" href="classNL3D_1_1CDriverGL.html#z417_2">_EVSPositionHandle</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a324">GL_ZERO_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a325">GL_ONE_EXT</a>); +01022 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Swizzle (Complete secondary color)"</font>); +01023 ++numSwizzle; +01024 } +01025 <font class="keywordflow">else</font> +01026 { +01027 <a class="code" href="debug_8h.html#a6">nlassert</a>(componentWritten[<a class="code" href="structCVPOperand.html#s42s26">CVPOperand::OSecondaryColor</a>] == 0xf) +01028 } +01029 <a class="code" href="debug_8h.html#a6">nlassert</a>(componentWritten[<a class="code" href="structCVPOperand.html#s42s24">CVPOperand::OHPosition</a>] == 0xf); <font class="comment">// should have written all component of position </font> +01030 +01031 glError = glGetError(); +01032 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR); +01033 +01034 <font class="comment">// if fog has been written, perform conversion</font> +01035 <font class="keywordflow">if</font> (componentWritten[<a class="code" href="structCVPOperand.html#s42s29">CVPOperand::OFogCoord</a>] == 0xf) +01036 { +01037 <font class="comment">// Well this could be avoided, but we should make 2 cases for each vertex program.. :(</font> +01038 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister, <a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + 96, <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a316">GL_X_EXT</a>); +01039 <a class="code" href="namespaceNL3D.html#a358">doSwizzle</a>(firstTempRegister + 1, <a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + 96, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a317">GL_Y_EXT</a>); +01040 <a class="code" href="driver__opengl__extension_8h.html#a123">nglShaderOp3EXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a238">GL_OP_MADD_EXT</a>, firstTempRegister + 2, fogTemp, firstTempRegister, firstTempRegister + 1); +01041 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Use MAD for fog conversion"</font>); +01042 <a class="code" href="driver__opengl__extension_8h.html#a127">nglExtractComponentEXT</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a291">GL_OUTPUT_FOG_EXT</a>, firstTempRegister + 2, 0); +01043 <a class="code" href="driver__opengl__vertex__program_8cpp.html#a1">EVS_INFO</a>(<font class="stringliteral">"Extract component to fog"</font>); +01044 } +01045 +01046 glError = glGetError(); +01047 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR); +01048 } +01049 <a class="code" href="driver__opengl__extension_8h.html#a117">nglEndVertexShaderEXT</a>(); +01050 +01051 glError = glGetError(); +01052 <a class="code" href="debug_8h.html#a6">nlassert</a>(glError == GL_NO_ERROR); +01053 +01054 <a class="code" href="driver__opengl__extension__def_8h.html#a421">GLboolean</a> optimizedShader; +01055 glGetBooleanv(<a class="code" href="driver__opengl__extension__def_8h.html#a315">GL_VERTEX_SHADER_OPTIMIZED_EXT</a>, &optimizedShader); +01056 <font class="keywordflow">if</font> (!optimizedShader) +01057 { +01058 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Failed to optimize a vertex program with the EXT_vertex_shader extension, this shader will be disabled"</font>); +01059 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01060 } +01061 +01062 <font class="comment">// see which input registers are used</font> +01063 usedInputRegisters = 0; +01064 +01065 uint k, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; +01066 <font class="comment">// convert each instruction of the vertex program</font> +01067 <font class="keywordflow">for</font>(k = 0; k < <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>.size(); ++k) +01068 { +01069 uint numSrc = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>[k].getNumUsedSrc(); +01070 <font class="keywordflow">for</font>(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < numSrc; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) +01071 { +01072 <font class="keyword">const</font> <a class="code" href="structCVPOperand.html">CVPOperand</a> &op = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>[k].getSrc(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>); +01073 <font class="keywordflow">if</font> (op.<a class="code" href="structCVPOperand.html#m0">Type</a> == <a class="code" href="structCVPOperand.html#s40s2">CVPOperand::InputRegister</a>) +01074 { +01075 usedInputRegisters |= <a class="code" href="namespaceNL3D.html#a357">convInputRegisterToVBFlag</a>(op.<a class="code" href="structCVPOperand.html#m5">Value</a>.InputRegisterValue); +01076 } +01077 } +01078 } +01079 +01080 <font class="preprocessor">#ifdef DEBUG_SETUP_EXT_VERTEX_SHADER</font> +01081 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"========================"</font>); +01082 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num Opcode = %d"</font>, numOp); +01083 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num Indexing = %d"</font>, numOpIndex); +01084 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num Swizzle = %d"</font>, numSwizzle); +01085 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num extract component = %d"</font>, numEC); +01086 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num insert component = %d"</font>, numIC); +01087 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"num write mask = %d"</font>, numWM); +01088 <font class="preprocessor">#endif</font> +01089 <font class="preprocessor"></font> +01090 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01091 +01092 } +01093 +01094 <font class="comment">// ***************************************************************************</font> +<a name="l01095"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z414_1">01095</a> <font class="keywordtype">bool</font> CDriverGL::activeEXTVertexShader (CVertexProgram *<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>) +01096 { +01097 <font class="comment">// Setup or unsetup ?</font> +01098 <font class="keywordflow">if</font> (program) +01099 { +01100 <font class="comment">// Driver info</font> +01101 <a class="code" href="classNL3D_1_1CDriverGL.html#l1">CVertexProgamDrvInfosGL</a> *drvInfo; +01102 +01103 <font class="comment">// Program setuped ?</font> +01104 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo==NULL) +01105 { +01106 <font class="comment">// try to parse the program</font> +01107 <a class="code" href="classCVPParser.html">CVPParser</a> parser; +01108 <a class="code" href="classCVPParser.html#s0">CVPParser::TProgram</a> parsedProgram; +01109 std::string errorOutput; +01110 <font class="keywordtype">bool</font> result = parser.<a class="code" href="classCVPParser.html#a0">parse</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->getProgram().c_str(), parsedProgram, errorOutput); +01111 <font class="keywordflow">if</font> (!result) +01112 { +01113 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Unable to parse a vertex program."</font>); +01114 <font class="preprocessor"> #ifdef NL_DEBUG</font> +01115 <font class="preprocessor"></font> <a class="code" href="debug_8h.html#a3">nlerror</a>(errorOutput.c_str()); +01116 <font class="preprocessor"> #endif</font> +01117 <font class="preprocessor"></font> <font class="keywordflow">return</font> <font class="keyword">false</font>; +01118 } +01119 +01120 <font class="comment">/* </font> +01121 <font class="comment"> FILE *f = fopen("c:\\test.txt", "wb");</font> +01122 <font class="comment"> if (f)</font> +01123 <font class="comment"> {</font> +01124 <font class="comment"> std::string vpText;</font> +01125 <font class="comment"> CVPParser::dump(parsedProgram, vpText);</font> +01126 <font class="comment"> fwrite(vpText.c_str(), vpText.size(), 1, f);</font> +01127 <font class="comment"> fclose(f);</font> +01128 <font class="comment"> }</font> +01129 <font class="comment"> */</font> +01130 +01131 <font class="comment">// Insert into driver list. (so it is deleted when driver is deleted).</font> +01132 <a class="code" href="namespaceNL3D.html#a297">ItVtxPrgDrvInfoPtrList</a> it= <a class="code" href="classNL3D_1_1IDriver.html#n5">_VtxPrgDrvInfos</a>.insert(<a class="code" href="classNL3D_1_1IDriver.html#n5">_VtxPrgDrvInfos</a>.end()); +01133 +01134 <font class="comment">// Create a driver info</font> +01135 *it = drvInfo = <font class="keyword">new</font> <a class="code" href="classNL3D_1_1CDriverGL.html#l1">CVertexProgamDrvInfosGL</a> (<font class="keyword">this</font>, it); +01136 <font class="comment">// Set the pointer</font> +01137 <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo=drvInfo; +01138 +01139 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CDriverGL.html#z417_1">setupEXTVertexShader</a>(parsedProgram, drvInfo->ID, drvInfo->Variants, drvInfo->UsedVertexComponents)) +01140 { +01141 <font class="keyword">delete</font> drvInfo; +01142 <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo = NULL; +01143 <a class="code" href="classNL3D_1_1IDriver.html#n5">_VtxPrgDrvInfos</a>.erase(it); +01144 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01145 } +01146 } +01147 <font class="keywordflow">else</font> +01148 { +01149 <font class="comment">// Cast the driver info pointer</font> +01150 drvInfo=safe_cast<CVertexProgamDrvInfosGL*>((<a class="code" href="classNL3D_1_1IDriver.html#l4">IVertexProgramDrvInfos</a>*)<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>->_DrvInfo); +01151 } +01152 +01153 glEnable( <a class="code" href="driver__opengl__extension__def_8h.html#a221">GL_VERTEX_SHADER_EXT</a>); +01154 <a class="code" href="classNL3D_1_1CDriverGL.html#o24">_VertexProgramEnabled</a> = <font class="keyword">true</font>; +01155 <a class="code" href="driver__opengl__extension_8h.html#a118">nglBindVertexShaderEXT</a>( drvInfo->ID ); +01156 <a class="code" href="classNL3D_1_1CDriverGL.html#o26">_LastSetuppedVP</a> = <a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>; +01157 } +01158 <font class="keywordflow">else</font> +01159 { +01160 glDisable( <a class="code" href="driver__opengl__extension__def_8h.html#a221">GL_VERTEX_SHADER_EXT</a> ); +01161 <a class="code" href="classNL3D_1_1CDriverGL.html#o24">_VertexProgramEnabled</a> = <font class="keyword">false</font>; +01162 } +01163 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01164 } +01165 +01166 <font class="comment">// ***************************************************************************</font> +<a name="l01167"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_2">01167</a> <font class="keywordtype">bool</font> CDriverGL::activeVertexProgram (CVertexProgram *<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>) +01168 { +01169 <font class="comment">// Extension here ?</font> +01170 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01171 { +01172 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CDriverGL.html#z414_0">activeNVVertexProgram</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>); +01173 } +01174 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01175 { +01176 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CDriverGL.html#z414_1">activeEXTVertexShader</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a360">program</a>); +01177 } +01178 +01179 <font class="comment">// Can't do anything</font> +01180 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01181 } +01182 +01183 +01184 <font class="comment">// ***************************************************************************</font> +01185 +<a name="l01186"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_3">01186</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keywordtype">float</font> f0, <font class="keywordtype">float</font> f1, <font class="keywordtype">float</font> f2, <font class="keywordtype">float</font> f3) +01187 { +01188 <font class="comment">// Vertex program exist ?</font> +01189 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01190 { +01191 <font class="comment">// Setup constant</font> +01192 <a class="code" href="driver__opengl__extension_8h.html#a71">nglProgramParameter4fNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, f0, f1, f2, f3); +01193 } +01194 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01195 { +01196 <font class="keywordtype">float</font> datas[] = { f0, f1, f2, f3 }; +01197 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_FLOAT, datas); +01198 } +01199 } +01200 +01201 +01202 <font class="comment">// ***************************************************************************</font> +01203 +<a name="l01204"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_4">01204</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keywordtype">double</font> d0, <font class="keywordtype">double</font> d1, <font class="keywordtype">double</font> d2, <font class="keywordtype">double</font> d3) +01205 { +01206 <font class="comment">// Vertex program exist ?</font> +01207 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01208 { +01209 <font class="comment">// Setup constant</font> +01210 <a class="code" href="driver__opengl__extension_8h.html#a69">nglProgramParameter4dNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, d0, d1, d2, d3); +01211 } +01212 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01213 { +01214 <font class="keywordtype">double</font> datas[] = { d0, d1, d2, d3 }; +01215 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_DOUBLE, datas); +01216 } +01217 } +01218 +01219 +01220 <font class="comment">// ***************************************************************************</font> +01221 +<a name="l01222"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_5">01222</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a>& <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>) +01223 { +01224 <font class="comment">// Vertex program exist ?</font> +01225 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01226 { +01227 <font class="comment">// Setup constant</font> +01228 <a class="code" href="driver__opengl__extension_8h.html#a71">nglProgramParameter4fNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, value.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, value.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, value.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>, 0); +01229 } +01230 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01231 { +01232 <font class="keywordtype">float</font> datas[] = { value.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>, value.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>, value.<a class="code" href="classNLMISC_1_1CVector.html#m2">z</a>, 0 }; +01233 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_FLOAT, datas); +01234 } +01235 } +01236 +01237 +01238 <font class="comment">// ***************************************************************************</font> +01239 +<a name="l01240"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_6">01240</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVectorD.html">NLMISC::CVectorD</a>& <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>) +01241 { +01242 <font class="comment">// Vertex program exist ?</font> +01243 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01244 { +01245 <font class="comment">// Setup constant</font> +01246 <a class="code" href="driver__opengl__extension_8h.html#a69">nglProgramParameter4dNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, value.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>, value.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>, value.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>, 0); +01247 } +01248 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01249 { +01250 <font class="keywordtype">double</font> datas[] = { value.<a class="code" href="classNLMISC_1_1CVectorD.html#m0">x</a>, value.<a class="code" href="classNLMISC_1_1CVectorD.html#m1">y</a>, value.<a class="code" href="classNLMISC_1_1CVectorD.html#m2">z</a>, 0 }; +01251 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_DOUBLE, datas); +01252 } +01253 } +01254 +01255 +01256 <font class="comment">// ***************************************************************************</font> +<a name="l01257"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_7">01257</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>, <font class="keyword">const</font> <font class="keywordtype">float</font> *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>) +01258 { +01259 <font class="comment">// Vertex program exist ?</font> +01260 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01261 { +01262 <a class="code" href="driver__opengl__extension_8h.html#a74">nglProgramParameters4fvNV</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>); +01263 } +01264 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01265 { +01266 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>; ++k) +01267 { +01268 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> + k, GL_FLOAT, (<font class="keywordtype">void</font> *) (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a> + 4 * k)); +01269 } +01270 } +01271 } +01272 +01273 <font class="comment">// ***************************************************************************</font> +<a name="l01274"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_8">01274</a> <font class="keywordtype">void</font> CDriverGL::setConstant (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>, <font class="keyword">const</font> <font class="keywordtype">double</font> *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>) +01275 { +01276 <font class="comment">// Vertex program exist ?</font> +01277 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01278 { +01279 <a class="code" href="driver__opengl__extension_8h.html#a73">nglProgramParameters4dvNV</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>); +01280 } +01281 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01282 { +01283 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="driver__opengl__extension__def_8h.html#a410">num</a>; ++k) +01284 { +01285 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> + k, GL_DOUBLE, (<font class="keywordtype">void</font> *) (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a> + 4 * k)); +01286 } +01287 } +01288 } +01289 +01290 <font class="comment">// ***************************************************************************</font> +01291 +<a name="l01292"></a><a class="code" href="classNL3D_1_1CDriverGL.html#r4">01292</a> <font class="keyword">const</font> uint CDriverGL::GLMatrix[IDriver::NumMatrix]= +01293 { +01294 GL_MODELVIEW, +01295 GL_PROJECTION, +01296 <a class="code" href="driver__opengl__extension__def_8h.html#a9">GL_MODELVIEW_PROJECTION_NV</a> +01297 }; +01298 +01299 +01300 <font class="comment">// ***************************************************************************</font> +01301 +<a name="l01302"></a><a class="code" href="classNL3D_1_1CDriverGL.html#r5">01302</a> <font class="keyword">const</font> uint CDriverGL::GLTransform[IDriver::NumTransform]= +01303 { +01304 <a class="code" href="driver__opengl__extension__def_8h.html#a10">GL_IDENTITY_NV</a>, +01305 <a class="code" href="driver__opengl__extension__def_8h.html#a11">GL_INVERSE_NV</a>, +01306 <a class="code" href="driver__opengl__extension__def_8h.html#a12">GL_TRANSPOSE_NV</a>, +01307 <a class="code" href="driver__opengl__extension__def_8h.html#a13">GL_INVERSE_TRANSPOSE_NV</a> +01308 }; +01309 +01310 +01311 <font class="comment">// ***************************************************************************</font> +01312 +<a name="l01313"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_9">01313</a> <font class="keywordtype">void</font> CDriverGL::setConstantMatrix (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, IDriver::TMatrix <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>, IDriver::TTransform <a class="code" href="driver__opengl__extension__def_8h.html#a371">transform</a>) +01314 { +01315 <font class="comment">// Vertex program exist ?</font> +01316 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01317 { +01318 <font class="comment">// First, ensure that the render setup is correclty setuped.</font> +01319 <a class="code" href="classNL3D_1_1CDriverGL.html#c25">refreshRenderSetup</a>(); +01320 +01321 <font class="comment">// Track the matrix</font> +01322 <a class="code" href="driver__opengl__extension_8h.html#a76">nglTrackMatrixNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="classNL3D_1_1CDriverGL.html#r4">GLMatrix</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>], <a class="code" href="classNL3D_1_1CDriverGL.html#r5">GLTransform</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a371">transform</a>]); +01323 <font class="comment">// Release Track => matrix data is copied.</font> +01324 <a class="code" href="driver__opengl__extension_8h.html#a76">nglTrackMatrixNV</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a1">GL_VERTEX_PROGRAM_NV</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_NONE, <a class="code" href="driver__opengl__extension__def_8h.html#a10">GL_IDENTITY_NV</a>); +01325 } +01326 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.EXTVertexShader) +01327 { +01328 <font class="comment">// First, ensure that the render setup is correctly setuped.</font> +01329 <a class="code" href="classNL3D_1_1CDriverGL.html#c25">refreshRenderSetup</a>(); +01330 CMatrix mat; +01331 <font class="keywordflow">switch</font> (matrix) +01332 { +01333 <font class="keywordflow">case</font> IDriver::ModelView: +01334 mat = <a class="code" href="classNL3D_1_1CDriverGL.html#o15">_ModelViewMatrix</a>; +01335 <font class="keywordflow">break</font>; +01336 <font class="keywordflow">case</font> IDriver::Projection: +01337 { +01338 <a class="code" href="classNL3D_1_1CDriverGL.html#c0">refreshProjMatrixFromGL</a>(); +01339 mat = <a class="code" href="classNL3D_1_1CDriverGL.html#o8">_GLProjMat</a>; +01340 } +01341 <font class="keywordflow">break</font>; +01342 <font class="keywordflow">case</font> IDriver::ModelViewProjection: +01343 <a class="code" href="classNL3D_1_1CDriverGL.html#c0">refreshProjMatrixFromGL</a>(); +01344 mat = <a class="code" href="classNL3D_1_1CDriverGL.html#o8">_GLProjMat</a> * <a class="code" href="classNL3D_1_1CDriverGL.html#o15">_ModelViewMatrix</a>; +01345 <font class="keywordflow">break</font>; +01346 } +01347 +01348 <font class="keywordflow">switch</font>(transform) +01349 { +01350 <font class="keywordflow">case</font> IDriver::Identity: <font class="keywordflow">break</font>; +01351 <font class="keywordflow">case</font> IDriver::Inverse: +01352 mat.invert(); +01353 <font class="keywordflow">break</font>; +01354 <font class="keywordflow">case</font> IDriver::Transpose: +01355 mat.transpose(); +01356 <font class="keywordflow">break</font>; +01357 <font class="keywordflow">case</font> IDriver::InverseTranspose: +01358 mat.invert(); +01359 mat.transpose(); +01360 <font class="keywordflow">break</font>; +01361 } +01362 mat.transpose(); +01363 <font class="keywordtype">float</font> matDatas[16]; +01364 mat.get(matDatas); +01365 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, GL_FLOAT, matDatas); +01366 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> + 1, GL_FLOAT, matDatas + 4); +01367 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> + 2, GL_FLOAT, matDatas + 8); +01368 <a class="code" href="driver__opengl__extension_8h.html#a129">nglSetInvariantEXT</a>(<a class="code" href="classNL3D_1_1CDriverGL.html#z417_6">_EVSConstantHandle</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> + 3, GL_FLOAT, matDatas + 12); +01369 } +01370 } +01371 +01372 <font class="comment">// ***************************************************************************</font> +01373 +<a name="l01374"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_10">01374</a> <font class="keywordtype">void</font> CDriverGL::enableVertexProgramDoubleSidedColor(<font class="keywordtype">bool</font> doubleSided) +01375 { +01376 <font class="comment">// Vertex program exist ?</font> +01377 <font class="keywordflow">if</font> (<a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram) +01378 { +01379 <font class="comment">// change mode (not cached because supposed to be rare)</font> +01380 <font class="keywordflow">if</font>(doubleSided) +01381 glEnable (<a class="code" href="driver__opengl__extension__def_8h.html#a27">GL_VERTEX_PROGRAM_TWO_SIDE_NV</a>); +01382 <font class="keywordflow">else</font> +01383 glDisable (<a class="code" href="driver__opengl__extension__def_8h.html#a27">GL_VERTEX_PROGRAM_TWO_SIDE_NV</a>); +01384 } +01385 } +01386 +01387 +01388 <font class="comment">// ***************************************************************************</font> +<a name="l01389"></a><a class="code" href="classNL3D_1_1CDriverGL.html#z413_11">01389</a> <font class="keywordtype">bool</font> CDriverGL::supportVertexProgramDoubleSidedColor()<font class="keyword"> const</font> +01390 <font class="keyword"></font>{ +01391 <font class="comment">// currenlty only supported by NV_VERTEX_PROGRAM</font> +01392 <font class="keywordflow">return</font> <a class="code" href="classNL3D_1_1CDriverGL.html#z403_0">_Extensions</a>.NVVertexProgram; +01393 } +01394 +01395 +01396 } <font class="comment">// NL3D</font> +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |