aboutsummaryrefslogtreecommitdiff
path: root/docs/doxygen/nel/matrix_8cpp-source.html
diff options
context:
space:
mode:
authorneodarz <neodarz@neodarz.net>2018-08-11 20:21:34 +0200
committerneodarz <neodarz@neodarz.net>2018-08-11 20:21:34 +0200
commit0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch)
tree2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /docs/doxygen/nel/matrix_8cpp-source.html
downloadnevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz
nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip
Initial commit
Diffstat (limited to 'docs/doxygen/nel/matrix_8cpp-source.html')
-rw-r--r--docs/doxygen/nel/matrix_8cpp-source.html1639
1 files changed, 1639 insertions, 0 deletions
diff --git a/docs/doxygen/nel/matrix_8cpp-source.html b/docs/doxygen/nel/matrix_8cpp-source.html
new file mode 100644
index 00000000..d9bde259
--- /dev/null
+++ b/docs/doxygen/nel/matrix_8cpp-source.html
@@ -0,0 +1,1639 @@
+<!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>&nbsp;<A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A>&nbsp;&nbsp;&nbsp;</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>&nbsp;<A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A>&nbsp;&nbsp;&nbsp;</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>
+&nbsp;
+
+<!-- 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>&nbsp;</td>
+</tr></table>
+<!-- Generated by Doxygen 1.2.14 -->
+<center>
+<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="namespacemembers.html">Namespace Members</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; <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> &nbsp; </center>
+<hr><h1>matrix.cpp</h1><a href="matrix_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001
+00007 <font class="comment">/* Copyright, 2000 Nevrax Ltd.</font>
+00008 <font class="comment"> *</font>
+00009 <font class="comment"> * This file is part of NEVRAX NEL.</font>
+00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font>
+00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
+00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font>
+00013 <font class="comment"> * any later version.</font>
+00014 <font class="comment"></font>
+00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font>
+00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font>
+00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font>
+00018 <font class="comment"> * General Public License for more details.</font>
+00019 <font class="comment"></font>
+00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
+00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font>
+00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font>
+00023 <font class="comment"> * MA 02111-1307, USA.</font>
+00024 <font class="comment"> */</font>
+00025
+00026 <font class="preprocessor">#include "<a class="code" href="stdmisc_8h.html">stdmisc.h</a>"</font>
+00027
+00028 <font class="preprocessor">#include "<a class="code" href="matrix_8h.html">nel/misc/matrix.h</a>"</font>
+00029 <font class="preprocessor">#include "<a class="code" href="plane_8h.html">nel/misc/plane.h</a>"</font>
+00030 <font class="preprocessor">#include "<a class="code" href="debug_8h.html">nel/misc/debug.h</a>"</font>
+00031
+00032 <font class="keyword">using</font> <font class="keyword">namespace </font>std;
+00033
+00034
+00035
+00036 <font class="keyword">namespace </font>NLMISC
+00037 {
+00038
+00039
+00040 <font class="comment">// ======================================================================================================</font>
+<a name="l00041"></a><a class="code" href="classNLMISC_1_1CMatrix.html#p0">00041</a> <font class="keyword">const</font> CMatrix CMatrix::Identity;
+00042
+00043
+00044 <font class="comment">// ======================================================================================================</font>
+00045 <font class="comment">// ======================================================================================================</font>
+00046 <font class="comment">// ======================================================================================================</font>
+00047
+00048
+00049 <font class="comment">// State Bits.</font>
+<a name="l00050"></a><a class="code" href="matrix_8cpp.html#a0">00050</a> <font class="preprocessor">#define MAT_TRANS 1</font>
+<a name="l00051"></a><a class="code" href="matrix_8cpp.html#a1">00051</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_ROT 2</font>
+<a name="l00052"></a><a class="code" href="matrix_8cpp.html#a2">00052</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_SCALEUNI 4</font>
+<a name="l00053"></a><a class="code" href="matrix_8cpp.html#a3">00053</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_SCALEANY 8</font>
+<a name="l00054"></a><a class="code" href="matrix_8cpp.html#a4">00054</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_PROJ 16</font>
+00055 <font class="preprocessor"></font><font class="comment">// Validity bits. These means that the part may be yet identity, but is valid in the floats.</font>
+00056 <font class="comment">// NB: MAT_VALIDTRANS no more used for faster Pos access</font>
+<a name="l00057"></a><a class="code" href="matrix_8cpp.html#a5">00057</a> <font class="preprocessor">#define MAT_VALIDROT 64</font>
+<a name="l00058"></a><a class="code" href="matrix_8cpp.html#a6">00058</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_VALIDPROJ 128</font>
+<a name="l00059"></a><a class="code" href="matrix_8cpp.html#a7">00059</a> <font class="preprocessor"></font><font class="preprocessor">#define MAT_VALIDALL (MAT_VALIDROT | MAT_VALIDPROJ)</font>
+00060 <font class="preprocessor"></font><font class="comment">// The identity is nothing.</font>
+<a name="l00061"></a><a class="code" href="matrix_8cpp.html#a8">00061</a> <font class="preprocessor">#define MAT_IDENTITY 0</font>
+00062 <font class="preprocessor"></font>
+00063
+00064
+00065 <font class="comment">// Matrix elements.</font>
+<a name="l00066"></a><a class="code" href="matrix_8cpp.html#a9">00066</a> <font class="preprocessor">#define a11 M[0]</font>
+<a name="l00067"></a><a class="code" href="matrix_8cpp.html#a10">00067</a> <font class="preprocessor"></font><font class="preprocessor">#define a21 M[1]</font>
+<a name="l00068"></a><a class="code" href="matrix_8cpp.html#a11">00068</a> <font class="preprocessor"></font><font class="preprocessor">#define a31 M[2]</font>
+<a name="l00069"></a><a class="code" href="matrix_8cpp.html#a12">00069</a> <font class="preprocessor"></font><font class="preprocessor">#define a41 M[3]</font>
+<a name="l00070"></a><a class="code" href="matrix_8cpp.html#a13">00070</a> <font class="preprocessor"></font><font class="preprocessor">#define a12 M[4]</font>
+<a name="l00071"></a><a class="code" href="matrix_8cpp.html#a14">00071</a> <font class="preprocessor"></font><font class="preprocessor">#define a22 M[5]</font>
+<a name="l00072"></a><a class="code" href="matrix_8cpp.html#a15">00072</a> <font class="preprocessor"></font><font class="preprocessor">#define a32 M[6]</font>
+<a name="l00073"></a><a class="code" href="matrix_8cpp.html#a16">00073</a> <font class="preprocessor"></font><font class="preprocessor">#define a42 M[7]</font>
+<a name="l00074"></a><a class="code" href="matrix_8cpp.html#a17">00074</a> <font class="preprocessor"></font><font class="preprocessor">#define a13 M[8]</font>
+<a name="l00075"></a><a class="code" href="matrix_8cpp.html#a18">00075</a> <font class="preprocessor"></font><font class="preprocessor">#define a23 M[9]</font>
+<a name="l00076"></a><a class="code" href="matrix_8cpp.html#a19">00076</a> <font class="preprocessor"></font><font class="preprocessor">#define a33 M[10]</font>
+<a name="l00077"></a><a class="code" href="matrix_8cpp.html#a20">00077</a> <font class="preprocessor"></font><font class="preprocessor">#define a43 M[11]</font>
+<a name="l00078"></a><a class="code" href="matrix_8cpp.html#a21">00078</a> <font class="preprocessor"></font><font class="preprocessor">#define a14 M[12]</font>
+<a name="l00079"></a><a class="code" href="matrix_8cpp.html#a22">00079</a> <font class="preprocessor"></font><font class="preprocessor">#define a24 M[13]</font>
+<a name="l00080"></a><a class="code" href="matrix_8cpp.html#a23">00080</a> <font class="preprocessor"></font><font class="preprocessor">#define a34 M[14]</font>
+<a name="l00081"></a><a class="code" href="matrix_8cpp.html#a24">00081</a> <font class="preprocessor"></font><font class="preprocessor">#define a44 M[15]</font>
+00082 <font class="preprocessor"></font>
+00083
+00084
+00085 <font class="comment">// ======================================================================================================</font>
+00086 <font class="comment">// ======================================================================================================</font>
+00087 <font class="comment">// ======================================================================================================</font>
+00088
+00089
+00090
+00091 <font class="comment">// ======================================================================================================</font>
+<a name="l00092"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z295_1">00092</a> <font class="keywordtype">bool</font> CMatrix::hasScalePart()<font class="keyword"> const</font>
+00093 <font class="keyword"></font>{
+00094 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;(<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>))!=0;
+00095 }
+<a name="l00096"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z295_4">00096</a> <font class="keywordtype">bool</font> CMatrix::hasProjectionPart()<font class="keyword"> const</font>
+00097 <font class="keyword"></font>{
+00098 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>)!=0;
+00099 }
+00100
+00101
+<a name="l00102"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z295_2">00102</a> <font class="keywordtype">bool</font> CMatrix::hasScaleUniform()<font class="keyword"> const</font>
+00103 <font class="keyword"></font>{
+00104 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>)!=0 &amp;&amp; (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>)==0;
+00105 }
+<a name="l00106"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z295_3">00106</a> <font class="keywordtype">float</font> CMatrix::getScaleUniform()<font class="keyword"> const</font>
+00107 <font class="keyword"></font>{
+00108 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#z295_2">hasScaleUniform</a>())
+00109 <font class="keywordflow">return</font> <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>;
+00110 <font class="keywordflow">else</font>
+00111 <font class="keywordflow">return</font> 1;
+00112 }
+00113
+00114
+00115
+00116 <font class="comment">// ======================================================================================================</font>
+<a name="l00117"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c7">00117</a> <font class="keyword">inline</font> <font class="keywordtype">bool</font> CMatrix::hasRot()<font class="keyword"> const</font>
+00118 <font class="keyword"></font>{
+00119 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;(<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>))!=0;
+00120 }
+<a name="l00121"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c6">00121</a> <font class="keyword">inline</font> <font class="keywordtype">bool</font> CMatrix::hasTrans()<font class="keyword"> const</font>
+00122 <font class="keyword"></font>{
+00123 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>)!=0;
+00124 }
+<a name="l00125"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c8">00125</a> <font class="keyword">inline</font> <font class="keywordtype">bool</font> CMatrix::hasProj()<font class="keyword"> const</font>
+00126 <font class="keyword"></font>{
+00127 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>)!=0;
+00128 }
+<a name="l00129"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c9">00129</a> <font class="keyword">inline</font> <font class="keywordtype">bool</font> CMatrix::hasAll()<font class="keyword"> const</font>
+00130 <font class="keyword"></font>{
+00131 <font class="keywordflow">return</font> (<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() &amp;&amp; <a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>() &amp;&amp; <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>());
+00132 }
+00133
+00134
+<a name="l00135"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c10">00135</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> CMatrix::testExpandRot()<font class="keyword"> const</font>
+00136 <font class="keyword"></font>{
+00137 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00138 <font class="keywordflow">return</font>;
+00139 <font class="keywordflow">if</font>(!(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a5">MAT_VALIDROT</a>))
+00140 {
+00141 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> *self= const_cast&lt;CMatrix*&gt;(this);
+00142 self-&gt;StateBit|=<a class="code" href="matrix_8cpp.html#a5">MAT_VALIDROT</a>;
+00143 self-&gt;a11= 1; self-&gt;a12=0; self-&gt;a13=0;
+00144 self-&gt;a21= 0; self-&gt;a22=1; self-&gt;a23=0;
+00145 self-&gt;a31= 0; self-&gt;a32=0; self-&gt;a33=1;
+00146 self-&gt;Scale33= 1;
+00147 }
+00148 }
+<a name="l00149"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c11">00149</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> CMatrix::testExpandProj()<font class="keyword"> const</font>
+00150 <font class="keyword"></font>{
+00151 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>())
+00152 <font class="keywordflow">return</font>;
+00153 <font class="keywordflow">if</font>(!(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;<a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>))
+00154 {
+00155 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> *self= const_cast&lt;CMatrix*&gt;(this);
+00156 self-&gt;StateBit|=<a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>;
+00157 self-&gt;a41=0; self-&gt;a42=0; self-&gt;a43=0; self-&gt;a44=1;
+00158 }
+00159 }
+00160
+00161
+00162 <font class="comment">// ======================================================================================================</font>
+<a name="l00163"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z289_1">00163</a> CMatrix::CMatrix(<font class="keyword">const</font> CMatrix &amp;m)
+00164 {
+00165 (*this)= m;
+00166 }
+00167 <font class="comment">// ======================================================================================================</font>
+<a name="l00168"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z289_2">00168</a> CMatrix &amp;CMatrix::operator=(<font class="keyword">const</font> CMatrix &amp;m)
+00169 {
+00170 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>= m.StateBit &amp; ~<a class="code" href="matrix_8cpp.html#a7">MAT_VALIDALL</a>;
+00171 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c9">hasAll</a>())
+00172 {
+00173 memcpy(<a class="code" href="classNLMISC_1_1CMatrix.html#o0">M</a>, m.M, 16*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00174 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= m.Scale33;
+00175 }
+00176 <font class="keywordflow">else</font>
+00177 {
+00178 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00179 {
+00180 memcpy(&amp;<a class="code" href="matrix_8cpp.html#a9">a11</a>, &amp;m.a11, 3*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00181 memcpy(&amp;<a class="code" href="matrix_8cpp.html#a13">a12</a>, &amp;m.a12, 3*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00182 memcpy(&amp;<a class="code" href="matrix_8cpp.html#a17">a13</a>, &amp;m.a13, 3*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00183 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= m.Scale33;
+00184 }
+00185 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>())
+00186 {
+00187 <a class="code" href="matrix_8cpp.html#a12">a41</a>= m.a41;
+00188 <a class="code" href="matrix_8cpp.html#a16">a42</a>= m.a42;
+00189 <a class="code" href="matrix_8cpp.html#a20">a43</a>= m.a43;
+00190 <a class="code" href="matrix_8cpp.html#a24">a44</a>= m.a44;
+00191 }
+00192 <font class="comment">// Must always copy Trans part.</font>
+00193 memcpy(&amp;<a class="code" href="matrix_8cpp.html#a21">a14</a>, &amp;m.a14, 3*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00194 }
+00195 <font class="keywordflow">return</font> *<font class="keyword">this</font>;
+00196 }
+00197
+00198
+00199 <font class="comment">// ======================================================================================================</font>
+<a name="l00200"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_0">00200</a> <font class="keywordtype">void</font> CMatrix::identity()
+00201 {
+00202 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>= <a class="code" href="matrix_8cpp.html#a8">MAT_IDENTITY</a>;
+00203 <font class="comment">// Reset just Pos because must always be valid for faster getPos()</font>
+00204 <a class="code" href="matrix_8cpp.html#a21">a14</a>= <a class="code" href="matrix_8cpp.html#a22">a24</a>= <a class="code" href="matrix_8cpp.html#a23">a34</a>= 0;
+00205 <font class="comment">// For optimisation it would be usefull to keep MAT_VALID states.</font>
+00206 <font class="comment">// But this slows identity(), and this may not be interesting...</font>
+00207 }
+00208 <font class="comment">// ======================================================================================================</font>
+<a name="l00209"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_1">00209</a> <font class="keywordtype">void</font> CMatrix::setRot(<font class="keyword">const</font> CVector &amp;i, <font class="keyword">const</font> CVector &amp;j, <font class="keyword">const</font> CVector &amp;k, <font class="keywordtype">bool</font> hintNoScale)
+00210 {
+00211 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>;
+00212 <font class="keywordflow">if</font>(hintNoScale)
+00213 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>);
+00214 <a class="code" href="matrix_8cpp.html#a9">a11</a>= i.x; <a class="code" href="matrix_8cpp.html#a13">a12</a>= j.x; <a class="code" href="matrix_8cpp.html#a17">a13</a>= k.x;
+00215 <a class="code" href="matrix_8cpp.html#a10">a21</a>= i.y; <a class="code" href="matrix_8cpp.html#a14">a22</a>= j.y; <a class="code" href="matrix_8cpp.html#a18">a23</a>= k.y;
+00216 <a class="code" href="matrix_8cpp.html#a11">a31</a>= i.z; <a class="code" href="matrix_8cpp.html#a15">a32</a>= j.z; <a class="code" href="matrix_8cpp.html#a19">a33</a>= k.z;
+00217 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= 1.0f;
+00218 }
+00219 <font class="comment">// ======================================================================================================</font>
+<a name="l00220"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_2">00220</a> <font class="keywordtype">void</font> CMatrix::setRot(<font class="keyword">const</font> <font class="keywordtype">float</font> m33[9], <font class="keywordtype">bool</font> hintNoScale)
+00221 {
+00222 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>;
+00223 <font class="keywordflow">if</font>(hintNoScale)
+00224 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>);
+00225 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m33[0]; <a class="code" href="matrix_8cpp.html#a13">a12</a>= m33[3]; <a class="code" href="matrix_8cpp.html#a17">a13</a>= m33[6];
+00226 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m33[1]; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m33[4]; <a class="code" href="matrix_8cpp.html#a18">a23</a>= m33[7];
+00227 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m33[2]; <a class="code" href="matrix_8cpp.html#a15">a32</a>= m33[5]; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m33[8];
+00228 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= 1.0f;
+00229 }
+00230 <font class="comment">// ======================================================================================================</font>
+<a name="l00231"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_3">00231</a> <font class="keywordtype">void</font> CMatrix::setRot(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, TRotOrder ro)
+00232 {
+00233 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> rot;
+00234 rot.identity();
+00235 rot.rotate(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, ro);
+00236 <font class="keywordtype">float</font> m33[9];
+00237 rot.getRot(m33);
+00238 <a class="code" href="classNLMISC_1_1CMatrix.html#z290_1">setRot</a>(m33, <font class="keyword">true</font>);
+00239 }
+00240
+00241
+00242 <font class="comment">// ======================================================================================================</font>
+<a name="l00243"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_5">00243</a> <font class="keywordtype">void</font> CMatrix::setRot(<font class="keyword">const</font> CMatrix &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>)
+00244 {
+00245 <font class="comment">// copy rotpart statebit from other.</font>
+00246 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>);
+00247 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.StateBit &amp; (<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>);
+00248 <font class="comment">// copy values.</font>
+00249 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00250 {
+00251 <a class="code" href="matrix_8cpp.html#a9">a11</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a12; <a class="code" href="matrix_8cpp.html#a17">a13</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a13;
+00252 <a class="code" href="matrix_8cpp.html#a10">a21</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a21; <a class="code" href="matrix_8cpp.html#a14">a22</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a23;
+00253 <a class="code" href="matrix_8cpp.html#a11">a31</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a31; <a class="code" href="matrix_8cpp.html#a15">a32</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a32; <a class="code" href="matrix_8cpp.html#a19">a33</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.a33;
+00254 <font class="comment">// if has scale, copy from matrix.</font>
+00255 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>)
+00256 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a370">matrix</a>.Scale33;
+00257 }
+00258 <font class="keywordflow">else</font>
+00259 {
+00260 <font class="comment">// we are rot identity, with undefined values.</font>
+00261 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a5">MAT_VALIDROT</a>;
+00262 }
+00263 }
+00264
+00265
+00266 <font class="comment">// ======================================================================================================</font>
+<a name="l00267"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_6">00267</a> <font class="keywordtype">void</font> CMatrix::setPos(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)
+00268 {
+00269 <a class="code" href="matrix_8cpp.html#a21">a14</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x;
+00270 <a class="code" href="matrix_8cpp.html#a22">a24</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y;
+00271 <a class="code" href="matrix_8cpp.html#a23">a34</a>= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00272 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a21">a14</a>!=0 || <a class="code" href="matrix_8cpp.html#a22">a24</a>!=0 || <a class="code" href="matrix_8cpp.html#a23">a34</a>!=0)
+00273 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00274 <font class="keywordflow">else</font>
+00275 <font class="comment">// The trans is identity</font>
+00276 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00277 }
+00278 <font class="comment">// ======================================================================================================</font>
+<a name="l00279"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_7">00279</a> <font class="keywordtype">void</font> CMatrix::movePos(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)
+00280 {
+00281 <a class="code" href="matrix_8cpp.html#a21">a14</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x;
+00282 <a class="code" href="matrix_8cpp.html#a22">a24</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y;
+00283 <a class="code" href="matrix_8cpp.html#a23">a34</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00284 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a21">a14</a>!=0 || <a class="code" href="matrix_8cpp.html#a22">a24</a>!=0 || <a class="code" href="matrix_8cpp.html#a23">a34</a>!=0)
+00285 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00286 <font class="keywordflow">else</font>
+00287 <font class="comment">// The trans is identity</font>
+00288 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00289 }
+00290 <font class="comment">// ======================================================================================================</font>
+<a name="l00291"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_8">00291</a> <font class="keywordtype">void</font> CMatrix::setProj(<font class="keyword">const</font> <font class="keywordtype">float</font> proj[4])
+00292 {
+00293 <a class="code" href="matrix_8cpp.html#a12">a41</a>= proj[0];
+00294 <a class="code" href="matrix_8cpp.html#a16">a42</a>= proj[1];
+00295 <a class="code" href="matrix_8cpp.html#a20">a43</a>= proj[2];
+00296 <a class="code" href="matrix_8cpp.html#a24">a44</a>= proj[3];
+00297
+00298 <font class="comment">// Check Proj state.</font>
+00299 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a12">a41</a>!=0 || <a class="code" href="matrix_8cpp.html#a16">a42</a>!=0 || <a class="code" href="matrix_8cpp.html#a20">a43</a>!=0 || <a class="code" href="matrix_8cpp.html#a24">a44</a>!=1)
+00300 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+00301 <font class="keywordflow">else</font>
+00302 {
+00303 <font class="comment">// The proj is identity, and is correcly setup!</font>
+00304 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+00305 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>;
+00306 }
+00307 }
+00308 <font class="comment">// ======================================================================================================</font>
+<a name="l00309"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_9">00309</a> <font class="keywordtype">void</font> CMatrix::resetProj()
+00310 {
+00311 <a class="code" href="matrix_8cpp.html#a12">a41</a>= 0;
+00312 <a class="code" href="matrix_8cpp.html#a16">a42</a>= 0;
+00313 <a class="code" href="matrix_8cpp.html#a20">a43</a>= 0;
+00314 <a class="code" href="matrix_8cpp.html#a24">a44</a>= 1;
+00315 <font class="comment">// The proj is identity, and is correcly setup!</font>
+00316 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+00317 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>;
+00318 }
+00319 <font class="comment">// ======================================================================================================</font>
+<a name="l00320"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_10">00320</a> <font class="keywordtype">void</font> CMatrix::set(<font class="keyword">const</font> <font class="keywordtype">float</font> m44[16])
+00321 {
+00322 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>= <a class="code" href="matrix_8cpp.html#a8">MAT_IDENTITY</a>;
+00323
+00324 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>;
+00325 memcpy(<a class="code" href="classNLMISC_1_1CMatrix.html#o0">M</a>, m44, 16*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00326 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= 1.0f;
+00327
+00328 <font class="comment">// Check Trans state.</font>
+00329 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a21">a14</a>!=0 || <a class="code" href="matrix_8cpp.html#a22">a24</a>!=0 || <a class="code" href="matrix_8cpp.html#a23">a34</a>!=0)
+00330 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00331 <font class="keywordflow">else</font>
+00332 <font class="comment">// The trans is identity</font>
+00333 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00334
+00335 <font class="comment">// Check Proj state.</font>
+00336 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a12">a41</a>!=0 || <a class="code" href="matrix_8cpp.html#a16">a42</a>!=0 || <a class="code" href="matrix_8cpp.html#a20">a43</a>!=0 || <a class="code" href="matrix_8cpp.html#a24">a44</a>!=1)
+00337 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+00338 <font class="keywordflow">else</font>
+00339 {
+00340 <font class="comment">// The proj is identity, and is correcly setup!</font>
+00341 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+00342 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>;
+00343 }
+00344 }
+00345
+00346
+00347 <font class="comment">// ======================================================================================================</font>
+00348 <font class="comment">// ======================================================================================================</font>
+00349 <font class="comment">// ======================================================================================================</font>
+00350
+00351
+00352 <font class="comment">// ======================================================================================================</font>
+<a name="l00353"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_0">00353</a> <font class="keywordtype">void</font> CMatrix::getRot(CVector &amp;i, CVector &amp;j, CVector &amp;k)<font class="keyword"> const</font>
+00354 <font class="keyword"></font>{
+00355 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00356 {
+00357 i.set(<a class="code" href="matrix_8cpp.html#a9">a11</a>, <a class="code" href="matrix_8cpp.html#a10">a21</a>, <a class="code" href="matrix_8cpp.html#a11">a31</a>);
+00358 j.set(<a class="code" href="matrix_8cpp.html#a13">a12</a>, <a class="code" href="matrix_8cpp.html#a14">a22</a>, <a class="code" href="matrix_8cpp.html#a15">a32</a>);
+00359 k.set(<a class="code" href="matrix_8cpp.html#a17">a13</a>, <a class="code" href="matrix_8cpp.html#a18">a23</a>, <a class="code" href="matrix_8cpp.html#a19">a33</a>);
+00360 }
+00361 <font class="keywordflow">else</font>
+00362 {
+00363 i.set(1, 0, 0);
+00364 j.set(0, 1, 0);
+00365 k.set(0, 0, 1);
+00366 }
+00367 }
+00368 <font class="comment">// ======================================================================================================</font>
+<a name="l00369"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_1">00369</a> <font class="keywordtype">void</font> CMatrix::getRot(<font class="keywordtype">float</font> m33[9])<font class="keyword"> const</font>
+00370 <font class="keyword"></font>{
+00371 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00372 {
+00373 m33[0]= <a class="code" href="matrix_8cpp.html#a9">a11</a>;
+00374 m33[1]= <a class="code" href="matrix_8cpp.html#a10">a21</a>;
+00375 m33[2]= <a class="code" href="matrix_8cpp.html#a11">a31</a>;
+00376
+00377 m33[3]= <a class="code" href="matrix_8cpp.html#a13">a12</a>;
+00378 m33[4]= <a class="code" href="matrix_8cpp.html#a14">a22</a>;
+00379 m33[5]= <a class="code" href="matrix_8cpp.html#a15">a32</a>;
+00380
+00381 m33[6]= <a class="code" href="matrix_8cpp.html#a17">a13</a>;
+00382 m33[7]= <a class="code" href="matrix_8cpp.html#a18">a23</a>;
+00383 m33[8]= <a class="code" href="matrix_8cpp.html#a19">a33</a>;
+00384 }
+00385 <font class="keywordflow">else</font>
+00386 {
+00387 m33[0]= 1;
+00388 m33[1]= 0;
+00389 m33[2]= 0;
+00390
+00391 m33[3]= 0;
+00392 m33[4]= 1;
+00393 m33[5]= 0;
+00394
+00395 m33[6]= 0;
+00396 m33[7]= 0;
+00397 m33[8]= 1;
+00398 }
+00399 }
+00400 <font class="comment">// ======================================================================================================</font>
+<a name="l00401"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_6">00401</a> <font class="keywordtype">void</font> CMatrix::getProj(<font class="keywordtype">float</font> proj[4])<font class="keyword"> const</font>
+00402 <font class="keyword"></font>{
+00403 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>())
+00404 {
+00405 proj[0]= <a class="code" href="matrix_8cpp.html#a12">a41</a>;
+00406 proj[1]= <a class="code" href="matrix_8cpp.html#a16">a42</a>;
+00407 proj[2]= <a class="code" href="matrix_8cpp.html#a20">a43</a>;
+00408 proj[3]= <a class="code" href="matrix_8cpp.html#a24">a44</a>;
+00409 }
+00410 <font class="keywordflow">else</font>
+00411 {
+00412 proj[0]= 0;
+00413 proj[1]= 0;
+00414 proj[2]= 0;
+00415 proj[3]= 1;
+00416 }
+00417 }
+00418 <font class="comment">// ======================================================================================================</font>
+<a name="l00419"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_7">00419</a> CVector CMatrix::getI()<font class="keyword"> const</font>
+00420 <font class="keyword"></font>{
+00421 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00422 <font class="keywordflow">return</font> CVector(<a class="code" href="matrix_8cpp.html#a9">a11</a>, <a class="code" href="matrix_8cpp.html#a10">a21</a>, <a class="code" href="matrix_8cpp.html#a11">a31</a>);
+00423 <font class="keywordflow">else</font>
+00424 <font class="keywordflow">return</font> CVector(1, 0, 0);
+00425 }
+00426 <font class="comment">// ======================================================================================================</font>
+<a name="l00427"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">00427</a> CVector CMatrix::getJ()<font class="keyword"> const</font>
+00428 <font class="keyword"></font>{
+00429 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00430 <font class="keywordflow">return</font> CVector(<a class="code" href="matrix_8cpp.html#a13">a12</a>, <a class="code" href="matrix_8cpp.html#a14">a22</a>, <a class="code" href="matrix_8cpp.html#a15">a32</a>);
+00431 <font class="keywordflow">else</font>
+00432 <font class="keywordflow">return</font> CVector(0, 1, 0);
+00433 }
+00434 <font class="comment">// ======================================================================================================</font>
+<a name="l00435"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_9">00435</a> CVector CMatrix::getK()<font class="keyword"> const</font>
+00436 <font class="keyword"></font>{
+00437 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+00438 <font class="keywordflow">return</font> CVector(<a class="code" href="matrix_8cpp.html#a17">a13</a>, <a class="code" href="matrix_8cpp.html#a18">a23</a>, <a class="code" href="matrix_8cpp.html#a19">a33</a>);
+00439 <font class="keywordflow">else</font>
+00440 <font class="keywordflow">return</font> CVector(0, 0, 1);
+00441 }
+00442 <font class="comment">// ======================================================================================================</font>
+<a name="l00443"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_10">00443</a> <font class="keywordtype">void</font> CMatrix::get(<font class="keywordtype">float</font> m44[16])<font class="keyword"> const</font>
+00444 <font class="keyword"></font>{
+00445 <font class="comment">// \todo yoyo: TODO_OPTIMIZE_it.</font>
+00446 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00447 <a class="code" href="classNLMISC_1_1CMatrix.html#c11">testExpandProj</a>();
+00448 memcpy(m44, <a class="code" href="classNLMISC_1_1CMatrix.html#o0">M</a>, 16*<font class="keyword">sizeof</font>(<font class="keywordtype">float</font>));
+00449 }
+00450 <font class="comment">// ======================================================================================================</font>
+<a name="l00451"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_11">00451</a> <font class="keyword">const</font> <font class="keywordtype">float</font> *CMatrix::get()<font class="keyword"> const</font>
+00452 <font class="keyword"></font>{
+00453 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00454 <a class="code" href="classNLMISC_1_1CMatrix.html#c11">testExpandProj</a>();
+00455 <font class="keywordflow">return</font> <a class="code" href="classNLMISC_1_1CMatrix.html#o0">M</a>;
+00456 }
+00457 <font class="comment">/*// ======================================================================================================</font>
+00458 <font class="comment">CVector CMatrix::toEuler(TRotOrder ro) const</font>
+00459 <font class="comment">{</font>
+00460 <font class="comment"></font>
+00461 <font class="comment">}*/</font>
+00462
+00463
+00464 <font class="comment">// ======================================================================================================</font>
+00465 <font class="comment">// ======================================================================================================</font>
+00466 <font class="comment">// ======================================================================================================</font>
+00467
+00468
+00469 <font class="comment">// ======================================================================================================</font>
+<a name="l00470"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_0">00470</a> <font class="keywordtype">void</font> CMatrix::translate(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)
+00471 {
+00472 <font class="comment">// SetTrans.</font>
+00473 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+00474 {
+00475 <a class="code" href="matrix_8cpp.html#a21">a14</a>+= <a class="code" href="matrix_8cpp.html#a9">a11</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a13">a12</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a17">a13</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00476 <a class="code" href="matrix_8cpp.html#a22">a24</a>+= <a class="code" href="matrix_8cpp.html#a10">a21</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a14">a22</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a18">a23</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00477 <a class="code" href="matrix_8cpp.html#a23">a34</a>+= <a class="code" href="matrix_8cpp.html#a11">a31</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a15">a32</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a19">a33</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00478 }
+00479 <font class="keywordflow">else</font>
+00480 {
+00481 <a class="code" href="matrix_8cpp.html#a21">a14</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x;
+00482 <a class="code" href="matrix_8cpp.html#a22">a24</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y;
+00483 <a class="code" href="matrix_8cpp.html#a23">a34</a>+= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00484 }
+00485
+00486 <font class="comment">// SetProj.</font>
+00487 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00488 <a class="code" href="matrix_8cpp.html#a24">a44</a>+= <a class="code" href="matrix_8cpp.html#a12">a41</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a16">a42</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a20">a43</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00489
+00490 <font class="comment">// Check Trans.</font>
+00491 <font class="keywordflow">if</font>(<a class="code" href="matrix_8cpp.html#a21">a14</a>!=0 || <a class="code" href="matrix_8cpp.html#a22">a24</a>!=0 || <a class="code" href="matrix_8cpp.html#a23">a34</a>!=0)
+00492 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00493 <font class="keywordflow">else</font>
+00494 <font class="comment">// The trans is identity, and is correcly setup!</font>
+00495 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+00496 }
+00497 <font class="comment">// ======================================================================================================</font>
+<a name="l00498"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_1">00498</a> <font class="keywordtype">void</font> CMatrix::rotateX(<font class="keywordtype">float</font> a)
+00499 {
+00500
+00501 <font class="keywordflow">if</font>(a==0)
+00502 <font class="keywordflow">return</font>;
+00503 <font class="keywordtype">double</font> ca,sa;
+00504 ca=cos(a);
+00505 sa=sin(a);
+00506
+00507 <font class="comment">// SetRot.</font>
+00508 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+00509 {
+00510 <font class="keywordtype">float</font> b12=<a class="code" href="matrix_8cpp.html#a13">a12</a>, b22=<a class="code" href="matrix_8cpp.html#a14">a22</a>, b32=<a class="code" href="matrix_8cpp.html#a15">a32</a>;
+00511 <font class="keywordtype">float</font> b13=<a class="code" href="matrix_8cpp.html#a17">a13</a>, b23=<a class="code" href="matrix_8cpp.html#a18">a23</a>, b33=<a class="code" href="matrix_8cpp.html#a19">a33</a>;
+00512 <a class="code" href="matrix_8cpp.html#a13">a12</a>= (float)(b12*ca + b13*sa);
+00513 <a class="code" href="matrix_8cpp.html#a14">a22</a>= (float)(b22*ca + b23*sa);
+00514 <a class="code" href="matrix_8cpp.html#a15">a32</a>= (float)(b32*ca + b33*sa);
+00515 <a class="code" href="matrix_8cpp.html#a17">a13</a>= (float)(b13*ca - b12*sa);
+00516 <a class="code" href="matrix_8cpp.html#a18">a23</a>= (float)(b23*ca - b22*sa);
+00517 <a class="code" href="matrix_8cpp.html#a19">a33</a>= (float)(b33*ca - b32*sa);
+00518 }
+00519 <font class="keywordflow">else</font>
+00520 {
+00521 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00522 <a class="code" href="matrix_8cpp.html#a13">a12</a>= 0.0f; <a class="code" href="matrix_8cpp.html#a14">a22</a>= (float)ca; <a class="code" href="matrix_8cpp.html#a15">a32</a>= (float)sa;
+00523 <a class="code" href="matrix_8cpp.html#a17">a13</a>= 0.0f; <a class="code" href="matrix_8cpp.html#a18">a23</a>= (float)-sa; <a class="code" href="matrix_8cpp.html#a19">a33</a>= (float)ca;
+00524 }
+00525
+00526 <font class="comment">// SetProj.</font>
+00527 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00528 {
+00529 <font class="keywordtype">float</font> b42=<a class="code" href="matrix_8cpp.html#a16">a42</a>, b43=<a class="code" href="matrix_8cpp.html#a20">a43</a>;
+00530 <a class="code" href="matrix_8cpp.html#a16">a42</a>= (float)(b42*ca + b43*sa);
+00531 <a class="code" href="matrix_8cpp.html#a20">a43</a>= (float)(b43*ca - b42*sa);
+00532 }
+00533
+00534 <font class="comment">// set Rot.</font>
+00535 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>;
+00536 }
+00537 <font class="comment">// ======================================================================================================</font>
+<a name="l00538"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_2">00538</a> <font class="keywordtype">void</font> CMatrix::rotateY(<font class="keywordtype">float</font> a)
+00539 {
+00540
+00541 <font class="keywordflow">if</font>(a==0)
+00542 <font class="keywordflow">return</font>;
+00543 <font class="keywordtype">double</font> ca,sa;
+00544 ca=cos(a);
+00545 sa=sin(a);
+00546
+00547 <font class="comment">// SetRot.</font>
+00548 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+00549 {
+00550 <font class="keywordtype">float</font> b11=<a class="code" href="matrix_8cpp.html#a9">a11</a>, b21=<a class="code" href="matrix_8cpp.html#a10">a21</a>, b31=<a class="code" href="matrix_8cpp.html#a11">a31</a>;
+00551 <font class="keywordtype">float</font> b13=<a class="code" href="matrix_8cpp.html#a17">a13</a>, b23=<a class="code" href="matrix_8cpp.html#a18">a23</a>, b33=<a class="code" href="matrix_8cpp.html#a19">a33</a>;
+00552 <a class="code" href="matrix_8cpp.html#a9">a11</a>= (float)(b11*ca - b13*sa);
+00553 <a class="code" href="matrix_8cpp.html#a10">a21</a>= (float)(b21*ca - b23*sa);
+00554 <a class="code" href="matrix_8cpp.html#a11">a31</a>= (float)(b31*ca - b33*sa);
+00555 <a class="code" href="matrix_8cpp.html#a17">a13</a>= (float)(b13*ca + b11*sa);
+00556 <a class="code" href="matrix_8cpp.html#a18">a23</a>= (float)(b23*ca + b21*sa);
+00557 <a class="code" href="matrix_8cpp.html#a19">a33</a>= (float)(b33*ca + b31*sa);
+00558 }
+00559 <font class="keywordflow">else</font>
+00560 {
+00561 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00562 <a class="code" href="matrix_8cpp.html#a9">a11</a>= (float)ca; <a class="code" href="matrix_8cpp.html#a10">a21</a>=0.0f; <a class="code" href="matrix_8cpp.html#a11">a31</a>= (float)-sa;
+00563 <a class="code" href="matrix_8cpp.html#a17">a13</a>= (float)sa; <a class="code" href="matrix_8cpp.html#a18">a23</a>=0.0f; <a class="code" href="matrix_8cpp.html#a19">a33</a>= (float)ca;
+00564 }
+00565
+00566 <font class="comment">// SetProj.</font>
+00567 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00568 {
+00569 <font class="keywordtype">float</font> b41=<a class="code" href="matrix_8cpp.html#a12">a41</a>, b43=<a class="code" href="matrix_8cpp.html#a20">a43</a>;
+00570 <a class="code" href="matrix_8cpp.html#a12">a41</a>= (float)(b41*ca - b43*sa);
+00571 <a class="code" href="matrix_8cpp.html#a20">a43</a>= (float)(b43*ca + b41*sa);
+00572 }
+00573
+00574 <font class="comment">// set Rot.</font>
+00575 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>;
+00576 }
+00577 <font class="comment">// ======================================================================================================</font>
+<a name="l00578"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_3">00578</a> <font class="keywordtype">void</font> CMatrix::rotateZ(<font class="keywordtype">float</font> a)
+00579 {
+00580
+00581 <font class="keywordflow">if</font>(a==0)
+00582 <font class="keywordflow">return</font>;
+00583 <font class="keywordtype">double</font> ca,sa;
+00584 ca=cos(a);
+00585 sa=sin(a);
+00586
+00587 <font class="comment">// SetRot.</font>
+00588 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; (<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>) )
+00589 {
+00590 <font class="keywordtype">float</font> b11=<a class="code" href="matrix_8cpp.html#a9">a11</a>, b21=<a class="code" href="matrix_8cpp.html#a10">a21</a>, b31=<a class="code" href="matrix_8cpp.html#a11">a31</a>;
+00591 <font class="keywordtype">float</font> b12=<a class="code" href="matrix_8cpp.html#a13">a12</a>, b22=<a class="code" href="matrix_8cpp.html#a14">a22</a>, b32=<a class="code" href="matrix_8cpp.html#a15">a32</a>;
+00592 <a class="code" href="matrix_8cpp.html#a9">a11</a>= (float)(b11*ca + b12*sa);
+00593 <a class="code" href="matrix_8cpp.html#a10">a21</a>= (float)(b21*ca + b22*sa);
+00594 <a class="code" href="matrix_8cpp.html#a11">a31</a>= (float)(b31*ca + b32*sa);
+00595 <a class="code" href="matrix_8cpp.html#a13">a12</a>= (float)(b12*ca - b11*sa);
+00596 <a class="code" href="matrix_8cpp.html#a14">a22</a>= (float)(b22*ca - b21*sa);
+00597 <a class="code" href="matrix_8cpp.html#a15">a32</a>= (float)(b32*ca - b31*sa);
+00598 }
+00599 <font class="keywordflow">else</font>
+00600 {
+00601 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00602 <a class="code" href="matrix_8cpp.html#a9">a11</a>= (float)ca; <a class="code" href="matrix_8cpp.html#a10">a21</a>= (float)sa; <a class="code" href="matrix_8cpp.html#a11">a31</a>=0.0f;
+00603 <a class="code" href="matrix_8cpp.html#a13">a12</a>= (float)-sa; <a class="code" href="matrix_8cpp.html#a14">a22</a>= (float)ca; <a class="code" href="matrix_8cpp.html#a15">a32</a>=0.0f;
+00604 }
+00605
+00606 <font class="comment">// SetProj.</font>
+00607 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00608 {
+00609 <font class="keywordtype">float</font> b41=<a class="code" href="matrix_8cpp.html#a12">a41</a>, b42=<a class="code" href="matrix_8cpp.html#a16">a42</a>;
+00610 <a class="code" href="matrix_8cpp.html#a12">a41</a>= (float)(b41*ca + b42*sa);
+00611 <a class="code" href="matrix_8cpp.html#a16">a42</a>= (float)(b42*ca - b41*sa);
+00612 }
+00613
+00614 <font class="comment">// set Rot.</font>
+00615 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>;
+00616 }
+00617 <font class="comment">// ======================================================================================================</font>
+<a name="l00618"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_4">00618</a> <font class="keywordtype">void</font> CMatrix::rotate(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, TRotOrder ro)
+00619 {
+00620 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> rot;
+00621 rot.identity();
+00622 <font class="keywordflow">switch</font>(ro)
+00623 {
+00624 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s0">XYZ</a>: rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); <font class="keywordflow">break</font>;
+00625 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s1">XZY</a>: rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); <font class="keywordflow">break</font>;
+00626 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s2">YXZ</a>: rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); <font class="keywordflow">break</font>;
+00627 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s3">YZX</a>: rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); <font class="keywordflow">break</font>;
+00628 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s4">ZXY</a>: rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); <font class="keywordflow">break</font>;
+00629 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s5">ZYX</a>: rot.rotateZ(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z); rot.rotateY(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y); rot.rotateX(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x); <font class="keywordflow">break</font>;
+00630 }
+00631
+00632 (*this)*= rot;
+00633 }
+00634
+00635 <font class="comment">// ======================================================================================================</font>
+<a name="l00636"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_5">00636</a> <font class="keywordtype">void</font> CMatrix::rotate(<font class="keyword">const</font> CQuat &amp;quat)
+00637 {
+00638 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> rot;
+00639 rot.setRot(quat);
+00640 (*this)*= rot;
+00641 }
+00642
+00643 <font class="comment">// ======================================================================================================</font>
+<a name="l00644"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_6">00644</a> <font class="keywordtype">void</font> CMatrix::scale(<font class="keywordtype">float</font> f)
+00645 {
+00646
+00647 <font class="keywordflow">if</font>(f==1.0f) <font class="keywordflow">return</font>;
+00648 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>)
+00649 {
+00650 <a class="code" href="classNLMISC_1_1CMatrix.html#z292_6">scale</a>(CVector(f,f,f));
+00651 }
+00652 <font class="keywordflow">else</font>
+00653 {
+00654 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00655 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>;
+00656 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>*=f;
+00657 <a class="code" href="matrix_8cpp.html#a9">a11</a>*= f; <a class="code" href="matrix_8cpp.html#a13">a12</a>*=f; <a class="code" href="matrix_8cpp.html#a17">a13</a>*=f;
+00658 <a class="code" href="matrix_8cpp.html#a10">a21</a>*= f; <a class="code" href="matrix_8cpp.html#a14">a22</a>*=f; <a class="code" href="matrix_8cpp.html#a18">a23</a>*=f;
+00659 <a class="code" href="matrix_8cpp.html#a11">a31</a>*= f; <a class="code" href="matrix_8cpp.html#a15">a32</a>*=f; <a class="code" href="matrix_8cpp.html#a19">a33</a>*=f;
+00660
+00661 <font class="comment">// SetProj.</font>
+00662 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00663 {
+00664 <a class="code" href="matrix_8cpp.html#a12">a41</a>*=f; <a class="code" href="matrix_8cpp.html#a16">a42</a>*=f; <a class="code" href="matrix_8cpp.html#a20">a43</a>*=f;
+00665 }
+00666 }
+00667 }
+00668 <font class="comment">// ======================================================================================================</font>
+<a name="l00669"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z292_7">00669</a> <font class="keywordtype">void</font> CMatrix::scale(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)
+00670 {
+00671
+00672 <font class="keywordflow">if</font>( <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>==CVector(1,1,1) ) <font class="keywordflow">return</font>;
+00673 <font class="keywordflow">if</font>( !(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>) &amp;&amp; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x==<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y &amp;&amp; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x==<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z)
+00674 {
+00675 <a class="code" href="classNLMISC_1_1CMatrix.html#z292_6">scale</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x);
+00676 }
+00677 <font class="keywordflow">else</font>
+00678 {
+00679 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00680 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|=<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>;
+00681 <a class="code" href="matrix_8cpp.html#a9">a11</a>*= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x; <a class="code" href="matrix_8cpp.html#a13">a12</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y; <a class="code" href="matrix_8cpp.html#a17">a13</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00682 <a class="code" href="matrix_8cpp.html#a10">a21</a>*= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x; <a class="code" href="matrix_8cpp.html#a14">a22</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y; <a class="code" href="matrix_8cpp.html#a18">a23</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00683 <a class="code" href="matrix_8cpp.html#a11">a31</a>*= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x; <a class="code" href="matrix_8cpp.html#a15">a32</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y; <a class="code" href="matrix_8cpp.html#a19">a33</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00684
+00685 <font class="comment">// SetProj.</font>
+00686 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+00687 {
+00688 <a class="code" href="matrix_8cpp.html#a12">a41</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x;
+00689 <a class="code" href="matrix_8cpp.html#a16">a42</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y;
+00690 <a class="code" href="matrix_8cpp.html#a20">a43</a>*=<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+00691 }
+00692 }
+00693 }
+00694
+00695
+00696 <font class="comment">// ======================================================================================================</font>
+00697 <font class="comment">// ======================================================================================================</font>
+00698 <font class="comment">// ======================================================================================================</font>
+00699
+00700
+00701 <font class="comment">// ***************************************************************************</font>
+<a name="l00702"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_3">00702</a> <font class="keywordtype">void</font> CMatrix::setMulMatrixNoProj(<font class="keyword">const</font> CMatrix &amp;m1, <font class="keyword">const</font> CMatrix &amp;m2)
+00703 {
+00704 <font class="comment">// Do *this= m1*m2</font>
+00705 <a class="code" href="classNLMISC_1_1CMatrix.html#z290_0">identity</a>();
+00706 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>= (m1.StateBit | m2.StateBit) &amp; (~MAT_PROJ);
+00707 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a7">MAT_VALIDALL</a>;
+00708
+00709
+00710 <font class="comment">// Build Rot part.</font>
+00711 <font class="comment">//===============</font>
+00712 <font class="keywordtype">bool</font> M1Identity= ! m1.hasRot();
+00713 <font class="keywordtype">bool</font> M2Identity= ! m2.hasRot();
+00714 <font class="keywordtype">bool</font> M1ScaleOnly= ! (m1.StateBit &amp; <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>);
+00715 <font class="keywordtype">bool</font> M2ScaleOnly= ! (m2.StateBit &amp; <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>);
+00716 <font class="keywordtype">bool</font> MGeneralCase= !M1Identity &amp;&amp; !M2Identity &amp;&amp; !M1ScaleOnly &amp;&amp; !M2ScaleOnly;
+00717
+00718
+00719 <font class="comment">// Manage the most common general case first (optim the if ): blending of two rotations.</font>
+00720 <font class="keywordflow">if</font>( MGeneralCase )
+00721 {
+00722 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11 + m1.a12*m2.a21 + m1.a13*m2.a31;
+00723 <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a11*m2.a12 + m1.a12*m2.a22 + m1.a13*m2.a32;
+00724 <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a11*m2.a13 + m1.a12*m2.a23 + m1.a13*m2.a33;
+00725
+00726 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a21*m2.a11 + m1.a22*m2.a21 + m1.a23*m2.a31;
+00727 <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a21*m2.a12 + m1.a22*m2.a22 + m1.a23*m2.a32;
+00728 <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a21*m2.a13 + m1.a22*m2.a23 + m1.a23*m2.a33;
+00729
+00730 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a31*m2.a11 + m1.a32*m2.a21 + m1.a33*m2.a31;
+00731 <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a31*m2.a12 + m1.a32*m2.a22 + m1.a33*m2.a32;
+00732 <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a31*m2.a13 + m1.a32*m2.a23 + m1.a33*m2.a33;
+00733 }
+00734 <font class="comment">// If one of the 3x3 matrix is an identity, just do a copy</font>
+00735 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1Identity || M2Identity )
+00736 {
+00737 <font class="comment">// If both identity, then me too.</font>
+00738 <font class="keywordflow">if</font>( M1Identity &amp;&amp; M2Identity )
+00739 {
+00740 <font class="comment">// just expand me (important because validated below)</font>
+00741 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00742 }
+00743 <font class="keywordflow">else</font>
+00744 {
+00745 <font class="comment">// Copy the non identity matrix.</font>
+00746 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> *c= M2Identity? &amp;m1 : &amp;m2;
+00747 <a class="code" href="matrix_8cpp.html#a9">a11</a>= c-&gt;a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= c-&gt;a12; <a class="code" href="matrix_8cpp.html#a17">a13</a>= c-&gt;a13;
+00748 <a class="code" href="matrix_8cpp.html#a10">a21</a>= c-&gt;a21; <a class="code" href="matrix_8cpp.html#a14">a22</a>= c-&gt;a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= c-&gt;a23;
+00749 <a class="code" href="matrix_8cpp.html#a11">a31</a>= c-&gt;a31; <a class="code" href="matrix_8cpp.html#a15">a32</a>= c-&gt;a32; <a class="code" href="matrix_8cpp.html#a19">a33</a>= c-&gt;a33;
+00750 }
+00751 }
+00752 <font class="comment">// If two 3x3 matrix are just scaleOnly matrix, do a scaleFact.</font>
+00753 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1ScaleOnly &amp;&amp; M2ScaleOnly )
+00754 {
+00755 <font class="comment">// same process for scaleUni or scaleAny.</font>
+00756 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= 0; <a class="code" href="matrix_8cpp.html#a17">a13</a>= 0;
+00757 <a class="code" href="matrix_8cpp.html#a10">a21</a>= 0; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= 0;
+00758 <a class="code" href="matrix_8cpp.html#a11">a31</a>= 0; <a class="code" href="matrix_8cpp.html#a15">a32</a>= 0; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00759 }
+00760 <font class="comment">// If one of the matrix is a scaleOnly matrix, do a scale*Rot.</font>
+00761 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1ScaleOnly &amp;&amp; !M2ScaleOnly )
+00762 {
+00763 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a11*m2.a12; <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a11*m2.a13;
+00764 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a22*m2.a21; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a22*m2.a23;
+00765 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a33*m2.a31; <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a33*m2.a32; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00766 }
+00767 <font class="keywordflow">else</font>
+00768 {
+00769 <font class="comment">// This must be this case</font>
+00770 <a class="code" href="debug_8h.html#a6">nlassert</a>(!M1ScaleOnly &amp;&amp; M2ScaleOnly);
+00771 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a12*m2.a22; <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a13*m2.a33;
+00772 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a21*m2.a11; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a23*m2.a33;
+00773 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a31*m2.a11; <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a32*m2.a22; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00774 }
+00775
+00776 <font class="comment">// Modify Scale.</font>
+00777 <font class="keywordflow">if</font>( (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>) &amp;&amp; !(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>) )
+00778 {
+00779 <font class="comment">// Must have correct Scale33</font>
+00780 m1.testExpandRot();
+00781 m2.testExpandRot();
+00782 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= m1.Scale33*m2.Scale33;
+00783 }
+00784 <font class="keywordflow">else</font>
+00785 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>=1;
+00786
+00787 <font class="comment">// In every case, I am valid now!</font>
+00788 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|=<a class="code" href="matrix_8cpp.html#a5">MAT_VALIDROT</a>;
+00789
+00790
+00791 <font class="comment">// Build Trans part.</font>
+00792 <font class="comment">//=================</font>
+00793 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a> )
+00794 {
+00795 <font class="comment">// Compose M2 part. NB: always suppose MAT_TRANS, for optim consideration.</font>
+00796 <font class="comment">// NB: the translation part is always valid, even if identity()</font>
+00797 <font class="keywordflow">if</font>( M1Identity )
+00798 {
+00799 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m2.a14 + m1.a14;
+00800 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m2.a24 + m1.a24;
+00801 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m2.a34 + m1.a34;
+00802 }
+00803 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (M1ScaleOnly )
+00804 {
+00805 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m1.a11*m2.a14 + m1.a14;
+00806 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m1.a22*m2.a24 + m1.a24;
+00807 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m1.a33*m2.a34 + m1.a34;
+00808 }
+00809 <font class="keywordflow">else</font>
+00810 {
+00811 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m1.a11*m2.a14 + m1.a12*m2.a24 + m1.a13*m2.a34 + m1.a14;
+00812 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m1.a21*m2.a14 + m1.a22*m2.a24 + m1.a23*m2.a34 + m1.a24;
+00813 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m1.a31*m2.a14 + m1.a32*m2.a24 + m1.a33*m2.a34 + m1.a34;
+00814 }
+00815 }
+00816
+00817 }
+00818
+00819
+00820 <font class="comment">// ***************************************************************************</font>
+<a name="l00821"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_0">00821</a> <font class="keywordtype">void</font> CMatrix::setMulMatrix(<font class="keyword">const</font> CMatrix &amp;m1, <font class="keyword">const</font> CMatrix &amp;m2)
+00822 {
+00823 <font class="comment">// Do *this= m1*m2</font>
+00824 <a class="code" href="classNLMISC_1_1CMatrix.html#z290_0">identity</a>();
+00825 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>= m1.StateBit | m2.StateBit;
+00826 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a7">MAT_VALIDALL</a>;
+00827
+00828 <font class="comment">// Build Rot part.</font>
+00829 <font class="comment">//===============</font>
+00830 <font class="keywordtype">bool</font> M1Identity= ! m1.hasRot();
+00831 <font class="keywordtype">bool</font> M2Identity= ! m2.hasRot();
+00832 <font class="keywordtype">bool</font> M1ScaleOnly= ! (m1.StateBit &amp; <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>);
+00833 <font class="keywordtype">bool</font> M2ScaleOnly= ! (m2.StateBit &amp; <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>);
+00834 <font class="keywordtype">bool</font> MGeneralCase= !M1Identity &amp;&amp; !M2Identity &amp;&amp; !M1ScaleOnly &amp;&amp; !M2ScaleOnly;
+00835
+00836
+00837 <font class="comment">// Manage the most common general case first (optim the if ): blending of two rotations.</font>
+00838 <font class="keywordflow">if</font>( MGeneralCase )
+00839 {
+00840 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11 + m1.a12*m2.a21 + m1.a13*m2.a31;
+00841 <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a11*m2.a12 + m1.a12*m2.a22 + m1.a13*m2.a32;
+00842 <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a11*m2.a13 + m1.a12*m2.a23 + m1.a13*m2.a33;
+00843
+00844 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a21*m2.a11 + m1.a22*m2.a21 + m1.a23*m2.a31;
+00845 <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a21*m2.a12 + m1.a22*m2.a22 + m1.a23*m2.a32;
+00846 <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a21*m2.a13 + m1.a22*m2.a23 + m1.a23*m2.a33;
+00847
+00848 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a31*m2.a11 + m1.a32*m2.a21 + m1.a33*m2.a31;
+00849 <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a31*m2.a12 + m1.a32*m2.a22 + m1.a33*m2.a32;
+00850 <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a31*m2.a13 + m1.a32*m2.a23 + m1.a33*m2.a33;
+00851 }
+00852 <font class="comment">// If one of the 3x3 matrix is an identity, just do a copy</font>
+00853 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1Identity || M2Identity )
+00854 {
+00855 <font class="comment">// If both identity, then me too.</font>
+00856 <font class="keywordflow">if</font>( M1Identity &amp;&amp; M2Identity )
+00857 {
+00858 <font class="comment">// just expand me (important because validated below)</font>
+00859 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+00860 }
+00861 <font class="keywordflow">else</font>
+00862 {
+00863 <font class="comment">// Copy the non identity matrix.</font>
+00864 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> *c= M2Identity? &amp;m1 : &amp;m2;
+00865 <a class="code" href="matrix_8cpp.html#a9">a11</a>= c-&gt;a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= c-&gt;a12; <a class="code" href="matrix_8cpp.html#a17">a13</a>= c-&gt;a13;
+00866 <a class="code" href="matrix_8cpp.html#a10">a21</a>= c-&gt;a21; <a class="code" href="matrix_8cpp.html#a14">a22</a>= c-&gt;a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= c-&gt;a23;
+00867 <a class="code" href="matrix_8cpp.html#a11">a31</a>= c-&gt;a31; <a class="code" href="matrix_8cpp.html#a15">a32</a>= c-&gt;a32; <a class="code" href="matrix_8cpp.html#a19">a33</a>= c-&gt;a33;
+00868 }
+00869 }
+00870 <font class="comment">// If two 3x3 matrix are just scaleOnly matrix, do a scaleFact.</font>
+00871 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1ScaleOnly &amp;&amp; M2ScaleOnly )
+00872 {
+00873 <font class="comment">// same process for scaleUni or scaleAny.</font>
+00874 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= 0; <a class="code" href="matrix_8cpp.html#a17">a13</a>= 0;
+00875 <a class="code" href="matrix_8cpp.html#a10">a21</a>= 0; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= 0;
+00876 <a class="code" href="matrix_8cpp.html#a11">a31</a>= 0; <a class="code" href="matrix_8cpp.html#a15">a32</a>= 0; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00877 }
+00878 <font class="comment">// If one of the matrix is a scaleOnly matrix, do a scale*Rot.</font>
+00879 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( M1ScaleOnly &amp;&amp; !M2ScaleOnly )
+00880 {
+00881 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a11*m2.a12; <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a11*m2.a13;
+00882 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a22*m2.a21; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a22*m2.a23;
+00883 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a33*m2.a31; <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a33*m2.a32; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00884 }
+00885 <font class="keywordflow">else</font>
+00886 {
+00887 <font class="comment">// This must be this case</font>
+00888 <a class="code" href="debug_8h.html#a6">nlassert</a>(!M1ScaleOnly &amp;&amp; M2ScaleOnly);
+00889 <a class="code" href="matrix_8cpp.html#a9">a11</a>= m1.a11*m2.a11; <a class="code" href="matrix_8cpp.html#a13">a12</a>= m1.a12*m2.a22; <a class="code" href="matrix_8cpp.html#a17">a13</a>= m1.a13*m2.a33;
+00890 <a class="code" href="matrix_8cpp.html#a10">a21</a>= m1.a21*m2.a11; <a class="code" href="matrix_8cpp.html#a14">a22</a>= m1.a22*m2.a22; <a class="code" href="matrix_8cpp.html#a18">a23</a>= m1.a23*m2.a33;
+00891 <a class="code" href="matrix_8cpp.html#a11">a31</a>= m1.a31*m2.a11; <a class="code" href="matrix_8cpp.html#a15">a32</a>= m1.a32*m2.a22; <a class="code" href="matrix_8cpp.html#a19">a33</a>= m1.a33*m2.a33;
+00892 }
+00893
+00894 <font class="comment">// If M1 has translate and M2 has projective, rotation is modified.</font>
+00895 <font class="keywordflow">if</font>( m1.hasTrans() &amp;&amp; m2.hasProj())
+00896 {
+00897 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>;
+00898
+00899 <a class="code" href="matrix_8cpp.html#a9">a11</a>+= m1.a14*m2.a41;
+00900 <a class="code" href="matrix_8cpp.html#a13">a12</a>+= m1.a14*m2.a42;
+00901 <a class="code" href="matrix_8cpp.html#a17">a13</a>+= m1.a14*m2.a43;
+00902
+00903 <a class="code" href="matrix_8cpp.html#a10">a21</a>+= m1.a24*m2.a41;
+00904 <a class="code" href="matrix_8cpp.html#a14">a22</a>+= m1.a24*m2.a42;
+00905 <a class="code" href="matrix_8cpp.html#a18">a23</a>+= m1.a24*m2.a43;
+00906
+00907 <a class="code" href="matrix_8cpp.html#a11">a31</a>+= m1.a34*m2.a41;
+00908 <a class="code" href="matrix_8cpp.html#a15">a32</a>+= m1.a34*m2.a42;
+00909 <a class="code" href="matrix_8cpp.html#a19">a33</a>+= m1.a34*m2.a43;
+00910 }
+00911
+00912 <font class="comment">// Modify Scale.</font>
+00913 <font class="keywordflow">if</font>( (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>) &amp;&amp; !(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>) )
+00914 {
+00915 <font class="comment">// Must have correct Scale33</font>
+00916 m1.testExpandRot();
+00917 m2.testExpandRot();
+00918 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= m1.Scale33*m2.Scale33;
+00919 }
+00920 <font class="keywordflow">else</font>
+00921 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>=1;
+00922
+00923 <font class="comment">// In every case, I am valid now!</font>
+00924 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|=<a class="code" href="matrix_8cpp.html#a5">MAT_VALIDROT</a>;
+00925
+00926
+00927 <font class="comment">// Build Trans part.</font>
+00928 <font class="comment">//=================</font>
+00929 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a> )
+00930 {
+00931 <font class="comment">// Compose M2 part.</font>
+00932 <font class="keywordflow">if</font>( M1Identity )
+00933 {
+00934 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m2.a14;
+00935 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m2.a24;
+00936 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m2.a34;
+00937 }
+00938 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (M1ScaleOnly )
+00939 {
+00940 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m1.a11*m2.a14;
+00941 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m1.a22*m2.a24;
+00942 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m1.a33*m2.a34;
+00943 }
+00944 <font class="keywordflow">else</font>
+00945 {
+00946 <a class="code" href="matrix_8cpp.html#a21">a14</a>= m1.a11*m2.a14 + m1.a12*m2.a24 + m1.a13*m2.a34;
+00947 <a class="code" href="matrix_8cpp.html#a22">a24</a>= m1.a21*m2.a14 + m1.a22*m2.a24 + m1.a23*m2.a34;
+00948 <a class="code" href="matrix_8cpp.html#a23">a34</a>= m1.a31*m2.a14 + m1.a32*m2.a24 + m1.a33*m2.a34;
+00949 }
+00950 <font class="comment">// Compose M1 part.</font>
+00951 <font class="keywordflow">if</font>(m1.StateBit &amp; <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>)
+00952 {
+00953 <font class="keywordflow">if</font>(m2.StateBit &amp; <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>)
+00954 {
+00955 <a class="code" href="matrix_8cpp.html#a21">a14</a>+= m1.a14*m2.a44;
+00956 <a class="code" href="matrix_8cpp.html#a22">a24</a>+= m1.a24*m2.a44;
+00957 <a class="code" href="matrix_8cpp.html#a23">a34</a>+= m1.a34*m2.a44;
+00958 }
+00959 <font class="keywordflow">else</font>
+00960 {
+00961 <a class="code" href="matrix_8cpp.html#a21">a14</a>+= m1.a14;
+00962 <a class="code" href="matrix_8cpp.html#a22">a24</a>+= m1.a24;
+00963 <a class="code" href="matrix_8cpp.html#a23">a34</a>+= m1.a34;
+00964 }
+00965 }
+00966 }
+00967
+00968
+00969 <font class="comment">// Build Proj part.</font>
+00970 <font class="comment">//=================</font>
+00971 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a> )
+00972 {
+00973 <font class="comment">// optimise nothing... (projection matrix are rare).</font>
+00974 m1.testExpandRot();
+00975 m1.testExpandProj();
+00976 m2.testExpandRot();
+00977 m2.testExpandProj();
+00978 <a class="code" href="matrix_8cpp.html#a12">a41</a>= m1.a41*m2.a11 + m1.a42*m2.a21 + m1.a43*m2.a31 + m1.a44*m2.a41;
+00979 <a class="code" href="matrix_8cpp.html#a16">a42</a>= m1.a41*m2.a12 + m1.a42*m2.a22 + m1.a43*m2.a32 + m1.a44*m2.a42;
+00980 <a class="code" href="matrix_8cpp.html#a20">a43</a>= m1.a41*m2.a13 + m1.a42*m2.a23 + m1.a43*m2.a33 + m1.a44*m2.a43;
+00981 <a class="code" href="matrix_8cpp.html#a24">a44</a>= m1.a41*m2.a14 + m1.a42*m2.a24 + m1.a43*m2.a34 + m1.a44*m2.a44;
+00982 <font class="comment">// The proj is valid now</font>
+00983 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a6">MAT_VALIDPROJ</a>;
+00984 }
+00985 <font class="keywordflow">else</font>
+00986 {
+00987 <font class="comment">// Don't copy proj part, and leave MAT_VALIDPROJ not set</font>
+00988 }
+00989 }
+00990 <font class="comment">// ======================================================================================================</font>
+<a name="l00991"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_6">00991</a> <font class="keywordtype">void</font> CMatrix::invert()
+00992 {
+00993
+00994 *<font class="keyword">this</font>= <a class="code" href="classNLMISC_1_1CMatrix.html#z293_7">inverted</a>();
+00995 }
+00996
+00997
+00998 <font class="comment">// ======================================================================================================</font>
+<a name="l00999"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_4">00999</a> <font class="keywordtype">void</font> CMatrix::transpose3x3()
+01000 {
+01001 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>())
+01002 {
+01003 <font class="comment">// swap values.</font>
+01004 swap(<a class="code" href="matrix_8cpp.html#a13">a12</a>, <a class="code" href="matrix_8cpp.html#a10">a21</a>);
+01005 swap(<a class="code" href="matrix_8cpp.html#a17">a13</a>, <a class="code" href="matrix_8cpp.html#a11">a31</a>);
+01006 swap(<a class="code" href="matrix_8cpp.html#a15">a32</a>, <a class="code" href="matrix_8cpp.html#a18">a23</a>);
+01007 <font class="comment">// Scale mode (none, uni, or any) is conserved. Scale33 too...</font>
+01008 }
+01009 }
+01010
+01011 <font class="comment">// ======================================================================================================</font>
+<a name="l01012"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_5">01012</a> <font class="keywordtype">void</font> CMatrix::transpose()
+01013 {
+01014 <a class="code" href="classNLMISC_1_1CMatrix.html#z293_4">transpose3x3</a>();
+01015 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>() || <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>())
+01016 {
+01017 <font class="comment">// if necessary, Get valid 0 on proj part.</font>
+01018 <a class="code" href="classNLMISC_1_1CMatrix.html#c11">testExpandProj</a>();
+01019 <font class="comment">// swap values</font>
+01020 swap(<a class="code" href="matrix_8cpp.html#a12">a41</a>, <a class="code" href="matrix_8cpp.html#a21">a14</a>);
+01021 swap(<a class="code" href="matrix_8cpp.html#a16">a42</a>, <a class="code" href="matrix_8cpp.html#a22">a24</a>);
+01022 swap(<a class="code" href="matrix_8cpp.html#a20">a43</a>, <a class="code" href="matrix_8cpp.html#a23">a34</a>);
+01023 <font class="comment">// swap StateBit flags, if not both were sets...</font>
+01024 <font class="keywordflow">if</font>(!<a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>() || !<a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>())
+01025 {
+01026 <font class="comment">// swap StateBit flags (swap trans with proj).</font>
+01027 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>())
+01028 {
+01029 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+01030 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+01031 }
+01032 <font class="keywordflow">else</font>
+01033 {
+01034 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+01035 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+01036 }
+01037 }
+01038 <font class="comment">// reset validity. NB, maybe not usefull, but simpler, and bugfree.</font>
+01039 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(MAT_VALIDPROJ);
+01040 }
+01041 <font class="comment">// NB: if no Trans or no Proj, do nothing, so don't need to modify VALIDTRANS and VALIDPROJ too.</font>
+01042 }
+01043
+01044
+01045 <font class="comment">// ======================================================================================================</font>
+<a name="l01046"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c0">01046</a> <font class="keywordtype">void</font> CMatrix::fastInvert33(CMatrix &amp;ret)<font class="keyword"> const</font>
+01047 <font class="keyword"></font>{
+01048 <font class="comment">// Fast invert of 3x3 rot matrix.</font>
+01049 <font class="comment">// Work if no scale and if MAT_SCALEUNI. doesn't work if MAT_SCALEANY.</font>
+01050
+01051 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>)
+01052 {
+01053 <font class="keywordtype">double</font> <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>,S; <font class="comment">// important for precision.</font>
+01054 <font class="comment">// Must divide the matrix by 1/Scale 2 times, to set unit, and to have a Scale=1/Scale.</font>
+01055 S=1.0/<a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>;
+01056 ret.Scale33= (float)S;
+01057 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=S*S;
+01058 <font class="comment">// The matrix is a base, so just transpose it.</font>
+01059 ret.a11= (float)(<a class="code" href="matrix_8cpp.html#a9">a11</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a12= (float)(<a class="code" href="matrix_8cpp.html#a10">a21</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a13= (float)(<a class="code" href="matrix_8cpp.html#a11">a31</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01060 ret.a21= (float)(<a class="code" href="matrix_8cpp.html#a13">a12</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a22= (float)(<a class="code" href="matrix_8cpp.html#a14">a22</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a23= (float)(<a class="code" href="matrix_8cpp.html#a15">a32</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01061 ret.a31= (float)(<a class="code" href="matrix_8cpp.html#a17">a13</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a32= (float)(<a class="code" href="matrix_8cpp.html#a18">a23</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a33= (float)(<a class="code" href="matrix_8cpp.html#a19">a33</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01062 }
+01063 <font class="keywordflow">else</font>
+01064 {
+01065 ret.Scale33=1;
+01066 <font class="comment">// The matrix is a base, so just transpose it.</font>
+01067 ret.a11= <a class="code" href="matrix_8cpp.html#a9">a11</a>; ret.a12= <a class="code" href="matrix_8cpp.html#a10">a21</a>; ret.a13=<a class="code" href="matrix_8cpp.html#a11">a31</a>;
+01068 ret.a21= <a class="code" href="matrix_8cpp.html#a13">a12</a>; ret.a22= <a class="code" href="matrix_8cpp.html#a14">a22</a>; ret.a23=<a class="code" href="matrix_8cpp.html#a15">a32</a>;
+01069 ret.a31= <a class="code" href="matrix_8cpp.html#a17">a13</a>; ret.a32= <a class="code" href="matrix_8cpp.html#a18">a23</a>; ret.a33=<a class="code" href="matrix_8cpp.html#a19">a33</a>;
+01070 }
+01071
+01072 <font class="comment">// 15 cycles if no scale.</font>
+01073 <font class="comment">// 35 cycles if scale.</font>
+01074 }
+01075 <font class="comment">// ======================================================================================================</font>
+<a name="l01076"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c1">01076</a> <font class="keywordtype">bool</font> CMatrix::slowInvert33(CMatrix &amp;ret)<font class="keyword"> const</font>
+01077 <font class="keyword"></font>{
+01078 CVector invi,invj,invk;
+01079 CVector i,j,k;
+01080 <font class="keywordtype">double</font> <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01081
+01082 i= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_7">getI</a>();
+01083 j= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">getJ</a>();
+01084 k= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_9">getK</a>();
+01085 <font class="comment">// Compute cofactors (minors *(-1)^(i+j)).</font>
+01086 invi.x= j.y*k.z - k.y*j.z;
+01087 invi.y= j.z*k.x - k.z*j.x;
+01088 invi.z= j.x*k.y - k.x*j.y;
+01089 invj.x= k.y*i.z - i.y*k.z;
+01090 invj.y= k.z*i.x - i.z*k.x;
+01091 invj.z= k.x*i.y - i.x*k.y;
+01092 invk.x= i.y*j.z - j.y*i.z;
+01093 invk.y= i.z*j.x - j.z*i.x;
+01094 invk.z= i.x*j.y - j.x*i.y;
+01095 <font class="comment">// compute determinant.</font>
+01096 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>= invi.x*i.x + invj.x*j.x + invk.x*k.x;
+01097 <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>==0)
+01098 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+01099 <font class="comment">// Transpose the Comatrice, and divide by determinant.</font>
+01100 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=1.0/<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01101 ret.a11= (float)(invi.x*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a12= (float)(invi.y*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a13= (float)(invi.z*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01102 ret.a21= (float)(invj.x*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a22= (float)(invj.y*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a23= (float)(invj.z*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01103 ret.a31= (float)(invk.x*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a32= (float)(invk.y*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>); ret.a33= (float)(invk.z*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01104
+01105 <font class="keywordflow">return</font> <font class="keyword">true</font>;
+01106 <font class="comment">// Roundly 82 cycles. (1Div=10 cycles).</font>
+01107 }
+01108 <font class="comment">// ======================================================================================================</font>
+<a name="l01109"></a><a class="code" href="classNLMISC_1_1CMatrix.html#c2">01109</a> <font class="keywordtype">bool</font> CMatrix::slowInvert44(CMatrix &amp;ret)<font class="keyword"> const</font>
+01110 <font class="keyword"></font>{
+01111 sint i,j;
+01112 <font class="keywordtype">double</font> <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01113
+01114 <font class="comment">// Compute Cofactors</font>
+01115 <font class="comment">//==================</font>
+01116 <font class="keywordflow">for</font>(i=0;i&lt;=3;i++)
+01117 {
+01118 <font class="keywordflow">for</font>(j=0;j&lt;=3;j++)
+01119 {
+01120 sint l1,l2,l3;
+01121 sint c1,c2,c3;
+01122 <a class="code" href="classNLMISC_1_1CMatrix.html#c5">getCofactIndex</a>(i,l1,l2,l3);
+01123 <a class="code" href="classNLMISC_1_1CMatrix.html#c5">getCofactIndex</a>(j,c1,c2,c3);
+01124
+01125 ret.mat(i,j)= 0;
+01126 ret.mat(i,j)+= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c1) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c2) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c3);
+01127 ret.mat(i,j)+= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c2) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c3) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c1);
+01128 ret.mat(i,j)+= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c3) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c1) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c2);
+01129
+01130 ret.mat(i,j)-= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c1) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c3) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c2);
+01131 ret.mat(i,j)-= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c2) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c1) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c3);
+01132 ret.mat(i,j)-= <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l1,c3) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l2,c2) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(l3,c1);
+01133
+01134 <font class="keywordflow">if</font>( (i+j)&amp;1 )
+01135 ret.mat(i,j)=-ret.mat(i,j);
+01136 }
+01137 }
+01138
+01139 <font class="comment">// Compute determinant.</font>
+01140 <font class="comment">//=====================</font>
+01141 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>= ret.mat(0,0) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(0,0) + ret.mat(0,1) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(0,1) + ret.mat(0,2) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(0,2) + ret.mat(0,3) * <a class="code" href="classNLMISC_1_1CMatrix.html#c3">mat</a>(0,3);
+01142 <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>==0)
+01143 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+01144
+01145 <font class="comment">// Divide by determinant.</font>
+01146 <font class="comment">//=======================</font>
+01147 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>=1.0/<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01148 <font class="keywordflow">for</font>(i=0;i&lt;=3;i++)
+01149 {
+01150 <font class="keywordflow">for</font>(j=0;j&lt;=3;j++)
+01151 ret.mat(i,j)= (float)(ret.mat(i,j)*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
+01152 }
+01153
+01154 <font class="comment">// Transpose the comatrice.</font>
+01155 <font class="comment">//=========================</font>
+01156 <font class="keywordflow">for</font>(i=0;i&lt;=3;i++)
+01157 {
+01158 <font class="keywordflow">for</font>(j=i+1;j&lt;=3;j++)
+01159 {
+01160 swap(ret.mat(i,j), ret.mat(j,i));
+01161 }
+01162 }
+01163
+01164 <font class="keywordflow">return</font> <font class="keyword">true</font>;
+01165 }
+01166 <font class="comment">// ======================================================================================================</font>
+<a name="l01167"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_7">01167</a> CMatrix CMatrix::inverted()<font class="keyword"> const</font>
+01168 <font class="keyword"></font>{
+01169
+01170 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> ret;
+01171
+01172 <font class="comment">// \todo yoyo: TODO_OPTIMIZE it...</font>
+01173 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+01174 <a class="code" href="classNLMISC_1_1CMatrix.html#c11">testExpandProj</a>();
+01175
+01176 <font class="comment">// Do a conventionnal 44 inversion.</font>
+01177 <font class="comment">//=================================</font>
+01178 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>)
+01179 {
+01180 <font class="keywordflow">if</font>(!<a class="code" href="classNLMISC_1_1CMatrix.html#c2">slowInvert44</a>(ret))
+01181 {
+01182 ret.identity();
+01183 <font class="keywordflow">return</font> ret;
+01184 }
+01185
+01186 <font class="comment">// Well, don't know what happens to matrix, so set all StateBit :).</font>
+01187 ret.StateBit= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>|<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>|<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+01188
+01189 <font class="comment">// Check Trans state.</font>
+01190 <font class="keywordflow">if</font>(ret.a14!=0 || ret.a24!=0 || ret.a34!=0)
+01191 ret.StateBit|= <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+01192 <font class="keywordflow">else</font>
+01193 ret.StateBit&amp;= ~<a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>;
+01194
+01195 <font class="comment">// Check Proj state.</font>
+01196 <font class="keywordflow">if</font>(ret.a41!=0 || ret.a42!=0 || ret.a43!=0 || ret.a44!=1)
+01197 ret.StateBit|= <a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+01198 <font class="keywordflow">else</font>
+01199 ret.StateBit&amp;= ~<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>;
+01200 }
+01201
+01202 <font class="comment">// Do a speed 34 inversion.</font>
+01203 <font class="comment">//=========================</font>
+01204 <font class="keywordflow">else</font>
+01205 {
+01206 <font class="comment">// Invert the rotation part.</font>
+01207 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>)
+01208 {
+01209 <font class="keywordflow">if</font>(!<a class="code" href="classNLMISC_1_1CMatrix.html#c1">slowInvert33</a>(ret))
+01210 {
+01211 ret.identity();
+01212 <font class="keywordflow">return</font> ret;
+01213 }
+01214 }
+01215 <font class="keywordflow">else</font>
+01216 <a class="code" href="classNLMISC_1_1CMatrix.html#c0">fastInvert33</a>(ret);
+01217 <font class="comment">// Scale33 is updated in fastInvert33().</font>
+01218
+01219 <font class="comment">// Invert the translation part.</font>
+01220 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a>)
+01221 {
+01222 <font class="comment">// Invert the translation part.</font>
+01223 <font class="comment">// This can only work if 4th line is 0 0 0 1.</font>
+01224 <font class="comment">// formula: InvVp= InvVi*(-Vp.x) + InvVj*(-Vp.y) + InvVk*(-Vp.z)</font>
+01225 ret.a14= ret.a11*(-<a class="code" href="matrix_8cpp.html#a21">a14</a>) + ret.a12*(-<a class="code" href="matrix_8cpp.html#a22">a24</a>) + ret.a13*(-<a class="code" href="matrix_8cpp.html#a23">a34</a>);
+01226 ret.a24= ret.a21*(-<a class="code" href="matrix_8cpp.html#a21">a14</a>) + ret.a22*(-<a class="code" href="matrix_8cpp.html#a22">a24</a>) + ret.a23*(-<a class="code" href="matrix_8cpp.html#a23">a34</a>);
+01227 ret.a34= ret.a31*(-<a class="code" href="matrix_8cpp.html#a21">a14</a>) + ret.a32*(-<a class="code" href="matrix_8cpp.html#a22">a24</a>) + ret.a33*(-<a class="code" href="matrix_8cpp.html#a23">a34</a>);
+01228 }
+01229 <font class="keywordflow">else</font>
+01230 {
+01231 ret.a14= 0;
+01232 ret.a24= 0;
+01233 ret.a34= 0;
+01234 }
+01235
+01236 <font class="comment">// The projection part is unmodified.</font>
+01237 ret.a41= 0; ret.a42= 0; ret.a43= 0; ret.a44= 1;
+01238
+01239 <font class="comment">// The matrix inverted keep the same state bits.</font>
+01240 ret.StateBit= <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>;
+01241 }
+01242
+01243
+01244 <font class="keywordflow">return</font> ret;
+01245 }
+01246 <font class="comment">// ======================================================================================================</font>
+<a name="l01247"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z293_8">01247</a> <font class="keywordtype">bool</font> CMatrix::normalize(TRotOrder ro)
+01248 {
+01249
+01250 CVector ti,tj,tk;
+01251 ti= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_7">getI</a>();
+01252 tj= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_8">getJ</a>();
+01253 tk= <a class="code" href="classNLMISC_1_1CMatrix.html#z291_9">getK</a>();
+01254
+01255 <font class="comment">// \todo yoyo: TODO_OPTIMIZE it...</font>
+01256 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+01257
+01258 <font class="comment">// Normalize with help of ro</font>
+01259 <font class="keywordflow">switch</font>(ro)
+01260 {
+01261 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s0">XYZ</a>:
+01262 ti.normalize();
+01263 tk= ti^tj;
+01264 tk.normalize();
+01265 tj= tk^ti;
+01266 <font class="keywordflow">break</font>;
+01267 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s1">XZY</a>:
+01268 ti.normalize();
+01269 tj= tk^ti;
+01270 tj.normalize();
+01271 tk= ti^tj;
+01272 <font class="keywordflow">break</font>;
+01273 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s2">YXZ</a>:
+01274 tj.normalize();
+01275 tk= ti^tj;
+01276 tk.normalize();
+01277 ti= tj^tk;
+01278 <font class="keywordflow">break</font>;
+01279 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s3">YZX</a>:
+01280 tj.normalize();
+01281 ti= tj^tk;
+01282 ti.normalize();
+01283 tk= ti^tj;
+01284 <font class="keywordflow">break</font>;
+01285 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s4">ZXY</a>:
+01286 tk.normalize();
+01287 tj= tk^ti;
+01288 tj.normalize();
+01289 ti= tj^tk;
+01290 <font class="keywordflow">break</font>;
+01291 <font class="keywordflow">case</font> <a class="code" href="classNLMISC_1_1CMatrix.html#s6s5">ZYX</a>:
+01292 tk.normalize();
+01293 ti= tj^tk;
+01294 ti.normalize();
+01295 tj= tk^ti;
+01296 <font class="keywordflow">break</font>;
+01297 }
+01298
+01299 <font class="comment">// Check, and set result.</font>
+01300 <font class="keywordflow">if</font>( ti.isNull() || tj.isNull() || tk.isNull() )
+01301 <font class="keywordflow">return</font> <font class="keyword">false</font>;
+01302 <a class="code" href="matrix_8cpp.html#a9">a11</a>= ti.x; <a class="code" href="matrix_8cpp.html#a13">a12</a>= tj.x; <a class="code" href="matrix_8cpp.html#a17">a13</a>= tk.x;
+01303 <a class="code" href="matrix_8cpp.html#a10">a21</a>= ti.y; <a class="code" href="matrix_8cpp.html#a14">a22</a>= tj.y; <a class="code" href="matrix_8cpp.html#a18">a23</a>= tk.y;
+01304 <a class="code" href="matrix_8cpp.html#a11">a31</a>= ti.z; <a class="code" href="matrix_8cpp.html#a15">a32</a>= tj.z; <a class="code" href="matrix_8cpp.html#a19">a33</a>= tk.z;
+01305 <font class="comment">// Scale is reseted.</font>
+01306 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>);
+01307 <font class="comment">// Rot is setup...</font>
+01308 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>;
+01309 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>=1;
+01310
+01311 <font class="keywordflow">return</font> <font class="keyword">true</font>;
+01312 }
+01313
+01314
+01315 <font class="comment">// ======================================================================================================</font>
+01316 <font class="comment">// ======================================================================================================</font>
+01317 <font class="comment">// ======================================================================================================</font>
+01318
+01319
+01320 <font class="comment">// ======================================================================================================</font>
+<a name="l01321"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z294_0">01321</a> CVector CMatrix::mulVector(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)<font class="keyword"> const</font>
+01322 <font class="keyword"></font>{
+01323
+01324 CVector ret;
+01325
+01326 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+01327 {
+01328 ret.x= <a class="code" href="matrix_8cpp.html#a9">a11</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a13">a12</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a17">a13</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01329 ret.y= <a class="code" href="matrix_8cpp.html#a10">a21</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a14">a22</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a18">a23</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01330 ret.z= <a class="code" href="matrix_8cpp.html#a11">a31</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a15">a32</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a19">a33</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01331 <font class="keywordflow">return</font> ret;
+01332 }
+01333 <font class="keywordflow">else</font>
+01334 <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
+01335 }
+01336
+01337 <font class="comment">// ======================================================================================================</font>
+<a name="l01338"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z294_1">01338</a> CVector CMatrix::mulPoint(<font class="keyword">const</font> CVector &amp;<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)<font class="keyword"> const</font>
+01339 <font class="keyword"></font>{
+01340
+01341 CVector ret;
+01342
+01343 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+01344 {
+01345 ret.x= <a class="code" href="matrix_8cpp.html#a9">a11</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a13">a12</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a17">a13</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01346 ret.y= <a class="code" href="matrix_8cpp.html#a10">a21</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a14">a22</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a18">a23</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01347 ret.z= <a class="code" href="matrix_8cpp.html#a11">a31</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a15">a32</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a19">a33</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z;
+01348 }
+01349 <font class="keywordflow">else</font>
+01350 {
+01351 ret= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
+01352 }
+01353 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>() )
+01354 {
+01355 ret.x+= <a class="code" href="matrix_8cpp.html#a21">a14</a>;
+01356 ret.y+= <a class="code" href="matrix_8cpp.html#a22">a24</a>;
+01357 ret.z+= <a class="code" href="matrix_8cpp.html#a23">a34</a>;
+01358 }
+01359
+01360 <font class="keywordflow">return</font> ret;
+01361 }
+01362
+01363
+01364 <font class="comment">/*</font>
+01365 <font class="comment"> * Multiply</font>
+01366 <font class="comment"> */</font>
+<a name="l01367"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z294_3">01367</a> CVectorH CMatrix::operator*(<font class="keyword">const</font> CVectorH&amp; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>)<font class="keyword"> const</font>
+01368 <font class="keyword"></font>{
+01369
+01370 CVectorH ret;
+01371
+01372 <font class="comment">// \todo yoyo: TODO_OPTIMIZE it...</font>
+01373 <a class="code" href="classNLMISC_1_1CMatrix.html#c10">testExpandRot</a>();
+01374 <a class="code" href="classNLMISC_1_1CMatrix.html#c11">testExpandProj</a>();
+01375
+01376 ret.x= <a class="code" href="matrix_8cpp.html#a9">a11</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a13">a12</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a17">a13</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z + <a class="code" href="matrix_8cpp.html#a21">a14</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.w;
+01377 ret.y= <a class="code" href="matrix_8cpp.html#a10">a21</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a14">a22</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a18">a23</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z + <a class="code" href="matrix_8cpp.html#a22">a24</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.w;
+01378 ret.z= <a class="code" href="matrix_8cpp.html#a11">a31</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a15">a32</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a19">a33</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z + <a class="code" href="matrix_8cpp.html#a23">a34</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.w;
+01379 ret.w= <a class="code" href="matrix_8cpp.html#a12">a41</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.x + <a class="code" href="matrix_8cpp.html#a16">a42</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.y + <a class="code" href="matrix_8cpp.html#a20">a43</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.z + <a class="code" href="matrix_8cpp.html#a24">a44</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>.w;
+01380 <font class="keywordflow">return</font> ret;
+01381 }
+01382
+01383
+01384 <font class="comment">// ======================================================================================================</font>
+<a name="l01385"></a><a class="code" href="classNLMISC_1_1CMatrix.html#a301">01385</a> CPlane <a class="code" href="namespaceNLMISC.html#a273">operator*</a>(<font class="keyword">const</font> CPlane &amp;p, <font class="keyword">const</font> CMatrix &amp;m)
+01386 {
+01387 <font class="comment">// \todo yoyo: TODO_OPTIMIZE it...</font>
+01388 m.testExpandRot();
+01389 m.testExpandProj();
+01390
+01391
+01392 CPlane ret;
+01393
+01394 <font class="keywordflow">if</font>( m.StateBit &amp; (<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>|<a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>|<a class="code" href="matrix_8cpp.html#a4">MAT_PROJ</a>) )
+01395 {
+01396 <font class="comment">// Compose with translation too.</font>
+01397 ret.a= p.a*m.a11 + p.b*m.a21 + p.c*m.a31 + p.d*m.a41;
+01398 ret.b= p.a*m.a12 + p.b*m.a22 + p.c*m.a32 + p.d*m.a42;
+01399 ret.c= p.a*m.a13 + p.b*m.a23 + p.c*m.a33 + p.d*m.a43;
+01400 ret.d= p.a*m.a14 + p.b*m.a24 + p.c*m.a34 + p.d*m.a44;
+01401 <font class="keywordflow">return</font> ret;
+01402 }
+01403 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( m.StateBit &amp; <a class="code" href="matrix_8cpp.html#a0">MAT_TRANS</a> )
+01404 {
+01405
+01406 <font class="comment">// Compose just with a translation.</font>
+01407 ret.a= p.a;
+01408 ret.b= p.b;
+01409 ret.c= p.c;
+01410 ret.d= p.a*m.a14 + p.b*m.a24 + p.c*m.a34 + p.d*m.a44;
+01411 <font class="keywordflow">return</font> ret;
+01412 }
+01413 <font class="keywordflow">else</font> <font class="comment">// Identity!!</font>
+01414 <font class="keywordflow">return</font> p;
+01415 }
+01416
+01417
+01418 <font class="comment">// ======================================================================================================</font>
+01419 <font class="comment">// ======================================================================================================</font>
+01420 <font class="comment">// ======================================================================================================</font>
+01421
+01422
+01423 <font class="comment">// ======================================================================================================</font>
+<a name="l01424"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z290_4">01424</a> <font class="keywordtype">void</font> CMatrix::setRot(<font class="keyword">const</font> CQuat &amp;quat)
+01425 {
+01426 <font class="comment">// A quaternion do not have scale.</font>
+01427 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>&amp;= ~(<a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>|<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a>);
+01428 <a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>= 1.0f;
+01429 <font class="keywordflow">if</font>(quat.isIdentity())
+01430 {
+01431 <a class="code" href="matrix_8cpp.html#a9">a11</a>= 1; <a class="code" href="matrix_8cpp.html#a13">a12</a>= 0; <a class="code" href="matrix_8cpp.html#a17">a13</a>= 0;
+01432 <a class="code" href="matrix_8cpp.html#a10">a21</a>= 0; <a class="code" href="matrix_8cpp.html#a14">a22</a>= 1; <a class="code" href="matrix_8cpp.html#a18">a23</a>= 0;
+01433 <a class="code" href="matrix_8cpp.html#a11">a31</a>= 0; <a class="code" href="matrix_8cpp.html#a15">a32</a>= 0; <a class="code" href="matrix_8cpp.html#a19">a33</a>= 1;
+01434 }
+01435 <font class="keywordflow">else</font>
+01436 {
+01437 <a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>|= <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>;
+01438 <font class="keywordtype">float</font> wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
+01439
+01440 <font class="comment">// calculate coefficients</font>
+01441 x2 = quat.x + quat.x; y2 = quat.y + quat.y;
+01442 z2 = quat.z + quat.z;
+01443 xx = quat.x * x2; xy = quat.x * y2; xz = quat.x * z2;
+01444 yy = quat.y * y2; yz = quat.y * z2; zz = quat.z * z2;
+01445 wx = quat.w * x2; wy = quat.w * y2; wz = quat.w * z2;
+01446
+01447 <a class="code" href="matrix_8cpp.html#a9">a11</a> = 1.0f - (yy + zz);
+01448 <a class="code" href="matrix_8cpp.html#a13">a12</a> = xy - wz;
+01449 <a class="code" href="matrix_8cpp.html#a17">a13</a> = xz + wy;
+01450
+01451 <a class="code" href="matrix_8cpp.html#a10">a21</a> = xy + wz;
+01452 <a class="code" href="matrix_8cpp.html#a14">a22</a> = 1.0f - (xx + zz);
+01453 <a class="code" href="matrix_8cpp.html#a18">a23</a> = yz - wx;
+01454
+01455 <a class="code" href="matrix_8cpp.html#a11">a31</a> = xz - wy;
+01456 <a class="code" href="matrix_8cpp.html#a15">a32</a> = yz + wx;
+01457 <a class="code" href="matrix_8cpp.html#a19">a33</a> = 1.0f - (xx + yy);
+01458 }
+01459 }
+01460
+01461
+01462 <font class="comment">// ======================================================================================================</font>
+<a name="l01463"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z291_2">01463</a> <font class="keywordtype">void</font> CMatrix::getRot(CQuat &amp;quat)<font class="keyword"> const</font>
+01464 <font class="keyword"></font>{
+01465 <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> *pmat= <font class="keyword">this</font>;
+01466 <a class="code" href="classNLMISC_1_1CMatrix.html#z289_0">CMatrix</a> MatNormed;
+01467
+01468
+01469 <font class="comment">// Rot Indentity?</font>
+01470 <font class="keywordflow">if</font>(! (<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; <a class="code" href="matrix_8cpp.html#a1">MAT_ROT</a>))
+01471 {
+01472 quat= CQuat::Identity;
+01473 <font class="keywordflow">return</font>;
+01474 }
+01475
+01476 <font class="comment">// Must normalize the matrix??</font>
+01477 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a> &amp; (<a class="code" href="matrix_8cpp.html#a2">MAT_SCALEUNI</a> | <a class="code" href="matrix_8cpp.html#a3">MAT_SCALEANY</a>) )
+01478 {
+01479 MatNormed= *<font class="keyword">this</font>;
+01480 MatNormed.normalize(<a class="code" href="classNLMISC_1_1CMatrix.html#s6s5">ZYX</a>);
+01481 pmat= &amp;MatNormed;
+01482 }
+01483
+01484 <font class="comment">// Compute quaternion.</font>
+01485 <font class="keywordtype">float</font> tr, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[4];
+01486
+01487 tr = pmat-&gt;a11 + pmat-&gt;a22 + pmat-&gt;a33;
+01488
+01489 <font class="comment">// check the diagonal</font>
+01490 <font class="keywordflow">if</font> (tr &gt; 0.0)
+01491 {
+01492 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> = (float)sqrt (tr + 1.0f);
+01493 quat.w = <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> / 2.0f;
+01494 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> = 0.5f / <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01495 quat.x = (pmat-&gt;a32 - pmat-&gt;a23) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01496 quat.y = (pmat-&gt;a13 - pmat-&gt;a31) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01497 quat.z = (pmat-&gt;a21 - pmat-&gt;a12) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01498 }
+01499 <font class="keywordflow">else</font>
+01500 {
+01501 sint i, j, k;
+01502 sint nxt[3] = {1, 2, 0};
+01503
+01504 <font class="comment">// diagonal is negative</font>
+01505 i = 0;
+01506 <font class="keywordflow">if</font> (pmat-&gt;a22 &gt; pmat-&gt;a11) i = 1;
+01507 <font class="keywordflow">if</font> (pmat-&gt;a33 &gt; pmat-&gt;mat(i,i) ) i = 2;
+01508 j = nxt[i];
+01509 k = nxt[j];
+01510
+01511 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> = (float) sqrt ( (pmat-&gt;mat(i,i) - (pmat-&gt;mat(j,j) + pmat-&gt;mat(k,k)) ) + 1.0);
+01512
+01513 <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[i] = <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> * 0.5f;
+01514
+01515 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> != 0.0f) <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a> = 0.5f / <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01516
+01517 <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[j] = (pmat-&gt;mat(j,i) + pmat-&gt;mat(i,j)) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01518 <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[k] = (pmat-&gt;mat(k,i) + pmat-&gt;mat(i,k)) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01519 <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[3] = (pmat-&gt;mat(k,j) - pmat-&gt;mat(j,k)) * <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
+01520
+01521 quat.x = <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[0];
+01522 quat.y = <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[1];
+01523 quat.z = <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[2];
+01524 quat.w = <a class="code" href="driver__opengl__extension__def_8h.html#a386">q</a>[3];
+01525 }
+01526
+01527 }
+01528
+01529
+01530 <font class="comment">// ======================================================================================================</font>
+01531 <font class="comment">// ======================================================================================================</font>
+01532 <font class="comment">// ======================================================================================================</font>
+01533
+01534
+01535 <font class="comment">// ======================================================================================================</font>
+<a name="l01536"></a><a class="code" href="classNLMISC_1_1CMatrix.html#z295_0">01536</a> <font class="keywordtype">void</font> CMatrix::serial(IStream &amp;f)
+01537 {
+01538 <font class="comment">// Use versionning, maybe for futur improvement.</font>
+01539 (void)f.serialVersion(0);
+01540
+01541 <font class="keywordflow">if</font>(f.isReading())
+01542 <a class="code" href="classNLMISC_1_1CMatrix.html#z290_0">identity</a>();
+01543 f.serial(<a class="code" href="classNLMISC_1_1CMatrix.html#o2">StateBit</a>);
+01544 f.serial(<a class="code" href="classNLMISC_1_1CMatrix.html#o1">Scale33</a>);
+01545 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c7">hasRot</a>() )
+01546 {
+01547 f.serial(<a class="code" href="matrix_8cpp.html#a9">a11</a>, <a class="code" href="matrix_8cpp.html#a13">a12</a>, <a class="code" href="matrix_8cpp.html#a17">a13</a>);
+01548 f.serial(<a class="code" href="matrix_8cpp.html#a10">a21</a>, <a class="code" href="matrix_8cpp.html#a14">a22</a>, <a class="code" href="matrix_8cpp.html#a18">a23</a>);
+01549 f.serial(<a class="code" href="matrix_8cpp.html#a11">a31</a>, <a class="code" href="matrix_8cpp.html#a15">a32</a>, <a class="code" href="matrix_8cpp.html#a19">a33</a>);
+01550 }
+01551 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c6">hasTrans</a>() )
+01552 {
+01553 f.serial(<a class="code" href="matrix_8cpp.html#a21">a14</a>, <a class="code" href="matrix_8cpp.html#a22">a24</a>, <a class="code" href="matrix_8cpp.html#a23">a34</a>);
+01554 }
+01555 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(f.isReading())
+01556 {
+01557 <font class="comment">// must reset because Pos must always be valid</font>
+01558 <a class="code" href="matrix_8cpp.html#a21">a14</a>= <a class="code" href="matrix_8cpp.html#a22">a24</a>= <a class="code" href="matrix_8cpp.html#a23">a34</a>= 0;
+01559 }
+01560 <font class="keywordflow">if</font>( <a class="code" href="classNLMISC_1_1CMatrix.html#c8">hasProj</a>() )
+01561 {
+01562 f.serial(<a class="code" href="matrix_8cpp.html#a12">a41</a>, <a class="code" href="matrix_8cpp.html#a16">a42</a>, <a class="code" href="matrix_8cpp.html#a20">a43</a>, <a class="code" href="matrix_8cpp.html#a24">a44</a>);
+01563 }
+01564 }
+01565
+01566
+01567
+01568
+01569 }
+01570
+</pre></div>
+
+<!-- footer -->
+<BR><FONT Size=+5>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </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>