diff options
author | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
---|---|---|
committer | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
commit | 0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch) | |
tree | 2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /docs/doxygen/nel/render__trav_8cpp-source.html | |
download | nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip |
Initial commit
Diffstat (limited to '')
-rw-r--r-- | docs/doxygen/nel/render__trav_8cpp-source.html | 1062 |
1 files changed, 1062 insertions, 0 deletions
diff --git a/docs/doxygen/nel/render__trav_8cpp-source.html b/docs/doxygen/nel/render__trav_8cpp-source.html new file mode 100644 index 00000000..4675049c --- /dev/null +++ b/docs/doxygen/nel/render__trav_8cpp-source.html @@ -0,0 +1,1062 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>render_trav.cpp</h1><a href="render__trav_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="std3d_8h.html">std3d.h</a>"</font> +00027 +00028 <font class="preprocessor">#include "<a class="code" href="render__trav_8h.html">3d/render_trav.h</a>"</font> +00029 <font class="preprocessor">#include "<a class="code" href="hrc__trav_8h.html">3d/hrc_trav.h</a>"</font> +00030 <font class="preprocessor">#include "<a class="code" href="clip__trav_8h.html">3d/clip_trav.h</a>"</font> +00031 <font class="preprocessor">#include "<a class="code" href="light__trav_8h.html">3d/light_trav.h</a>"</font> +00032 <font class="preprocessor">#include "<a class="code" href="driver_8h.html">3d/driver.h</a>"</font> +00033 <font class="preprocessor">#include "<a class="code" href="light_8h.html">3d/light.h</a>"</font> +00034 <font class="preprocessor">#include "<a class="code" href="skeleton__model_8h.html">3d/skeleton_model.h</a>"</font> +00035 <font class="preprocessor">#include "<a class="code" href="scene_8h.html">3d/scene.h</a>"</font> +00036 <font class="preprocessor">#include "<a class="code" href="coarse__mesh__manager_8h.html">3d/coarse_mesh_manager.h</a>"</font> +00037 <font class="preprocessor">#include "<a class="code" href="lod__character__manager_8h.html">3d/lod_character_manager.h</a>"</font> +00038 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00039 +00040 <font class="preprocessor">#include "<a class="code" href="transform_8h.html">3d/transform.h</a>"</font> +00041 <font class="preprocessor">#include "<a class="code" href="fast__floor_8h.html">3d/fast_floor.h</a>"</font> +00042 <font class="preprocessor">#include "<a class="code" href="mesh__skin__manager_8h.html">3d/mesh_skin_manager.h</a>"</font> +00043 +00044 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00045 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00046 +00047 +00048 <font class="keyword">namespace </font>NL3D +00049 { +00050 +00051 +00052 <font class="comment">// ***************************************************************************</font> +00053 <font class="comment">// ***************************************************************************</font> +00054 <font class="comment">// CRenderTrav</font> +00055 <font class="comment">// ***************************************************************************</font> +00056 <font class="comment">// ***************************************************************************</font> +00057 +00058 +00059 <font class="comment">// ***************************************************************************</font> +<a name="l00060"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#a0">00060</a> CRenderTrav::CRenderTrav() +00061 { +00062 <a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.reserve(1024); +00063 <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.init(1024); +00064 <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.init(1024); +00065 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a> = NULL; +00066 <a class="code" href="classNL3D_1_1CRenderTrav.html#o5">_CurrentPassOpaque</a> = <font class="keyword">true</font>; +00067 +00068 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_0">_CacheLightContribution</a>= NULL; +00069 +00070 <font class="comment">// Default light Setup.</font> +00071 <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_2">LightingSystemEnabled</a>= <font class="keyword">false</font>; +00072 <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_3">AmbientGlobal</a>= CRGBA(50, 50, 50); +00073 <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_4">SunAmbient</a>= CRGBA::Black; +00074 <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_5">SunDiffuse</a>= <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_6">SunSpecular</a>= CRGBA::White; +00075 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>.set(0, 0.5, -0.5); +00076 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>.normalize(); +00077 +00078 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_11">_StrongestLightTouched</a> = <font class="keyword">true</font>; +00079 +00080 <a class="code" href="classNL3D_1_1CRenderTrav.html#o7">_MeshSkinManager</a>= NULL; +00081 +00082 <a class="code" href="classNL3D_1_1CRenderTrav.html#o6">_LayersRenderingOrder</a>= <font class="keyword">true</font>; +00083 } +00084 <font class="comment">// ***************************************************************************</font> +<a name="l00085"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z745_0">00085</a> IObs *CRenderTrav::createDefaultObs()<font class="keyword"> const</font> +00086 <font class="keyword"></font>{ +00087 <font class="keywordflow">return</font> <font class="keyword">new</font> CDefaultRenderObs; +00088 } +00089 <font class="comment">// ***************************************************************************</font> +<a name="l00090"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z745_3">00090</a> <font class="keywordtype">void</font> CRenderTrav::traverse() +00091 { +00092 <a class="code" href="hierarchical__timer_8h.html#a4">H_AUTO</a>( NL3D_TravRender ); +00093 +00094 ITravCameraScene::update(); +00095 +00096 <font class="comment">// Bind to Driver.</font> +00097 <a class="code" href="classNL3D_1_1CRenderTrav.html#a2">getDriver</a>()->setFrustum(<a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_0">Left</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_1">Right</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_2">Bottom</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_3">Top</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_4">Near</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_5">Far</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_6">Perspective</a>); +00098 <font class="comment">// Use setupViewMatrixEx() for ZBuffer precision.</font> +00099 <a class="code" href="classNL3D_1_1CRenderTrav.html#a2">getDriver</a>()->setupViewMatrixEx(<a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_8">ViewMatrix</a>, <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_9">CamPos</a>); +00100 <a class="code" href="classNL3D_1_1CRenderTrav.html#a2">getDriver</a>()->setupViewport(<a class="code" href="classNL3D_1_1CRenderTrav.html#o4">_Viewport</a>); +00101 +00102 <font class="comment">// reset the light setup, and set global ambient.</font> +00103 <a class="code" href="classNL3D_1_1CRenderTrav.html#z748_1">resetLightSetup</a>(); +00104 +00105 +00106 <font class="comment">// reset the Skin manager, if needed</font> +00107 <font class="keywordflow">if</font>(_MeshSkinManager) +00108 { +00109 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>!=<a class="code" href="classNL3D_1_1CRenderTrav.html#o7">_MeshSkinManager</a>->getDriver()) +00110 { +00111 <a class="code" href="classNL3D_1_1CRenderTrav.html#o7">_MeshSkinManager</a>->release(); +00112 <a class="code" href="classNL3D_1_1CRenderTrav.html#o7">_MeshSkinManager</a>->init(<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>, <a class="code" href="render__trav_8h.html#a0">NL3D_MESH_SKIN_MANAGER_VERTEXFORMAT</a>, <a class="code" href="render__trav_8h.html#a1">NL3D_MESH_SKIN_MANAGER_MAXVERTICES</a>); +00113 } +00114 } +00115 +00116 +00117 <font class="comment">// Fill OT with observers, for both Opaque and transparent pass</font> +00118 <font class="comment">// =============================</font> +00119 +00120 <font class="comment">// Sort the observers by distance from camera</font> +00121 <font class="comment">// This is done here and not in the addRenderObs because of the LoadBalancing traversal which can modify</font> +00122 <font class="comment">// the transparency flag (multi lod for instance)</font> +00123 +00124 <font class="comment">// clear the OTs, and prepare to allocate max element space</font> +00125 <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.reset(<a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.size()); +00126 <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.reset(<a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.size()); +00127 +00128 <font class="comment">// fill the OTs.</font> +00129 IBaseRenderObs **itRdrObs= NULL; +00130 uint32 nNbObs = <a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.size(); +00131 <font class="keywordflow">if</font>(nNbObs) +00132 itRdrObs= &<a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>[0]; +00133 <font class="keywordtype">float</font> rPseudoZ, rPseudoZ2; +00134 +00135 <font class="comment">// Some precalc</font> +00136 <font class="keywordtype">float</font> OOFar= 1.0f / this-><a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_5">Far</a>; +00137 uint32 opaqueOtSize= <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.getSize(); +00138 uint32 opaqueOtMax= <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.getSize()-1; +00139 uint32 transparentOtSize= <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.getSize(); +00140 uint32 transparentOtMax= <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.getSize()-1; +00141 uint32 otId; +00142 <font class="comment">// fast floor</font> +00143 <a class="code" href="namespaceNL3D.html#a360">OptFastFloorBegin</a>(); +00144 <font class="comment">// For all rdr observers</font> +00145 <font class="keywordflow">for</font>( ; nNbObs>0; itRdrObs++, nNbObs-- ) +00146 { +00147 IBaseRenderObs *pObs= *itRdrObs; +00148 <font class="comment">// Only rdrObserver of transform models can be inserted!! It's a requirement</font> +00149 CTransform *pTransform = safe_cast<CTransform*>(pObs->Model); +00150 CTransformHrcObs *trHrcObs= safe_cast<CTransformHrcObs*>(pObs->HrcObs); +00151 +00152 <font class="comment">// Yoyo: skins are rendered through skeletons, so models WorldMatrix are all good here (even sticked objects)</font> +00153 rPseudoZ = (trHrcObs->WorldMatrix.getPos() - <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_9">CamPos</a>).norm(); +00154 +00155 <font class="comment">// rPseudoZ from 0.0 -> 1.0</font> +00156 rPseudoZ = sqrtf( rPseudoZ * OOFar ); +00157 +00158 <font class="keywordflow">if</font>( pTransform->isOpaque() ) +00159 { +00160 <font class="comment">// since norm, we are sure that rPseudoZ>=0</font> +00161 rPseudoZ2 = rPseudoZ * opaqueOtSize; +00162 otId= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(rPseudoZ2); +00163 otId= <a class="code" href="bit__set_8cpp.html#a0">min</a>(otId, opaqueOtMax); +00164 <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.insert( otId, pObs ); +00165 } +00166 <font class="keywordflow">if</font>( pTransform->isTransparent() ) +00167 { +00168 <font class="comment">// since norm, we are sure that rPseudoZ>=0</font> +00169 rPseudoZ2 = rPseudoZ * transparentOtSize; +00170 otId= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(rPseudoZ2); +00171 otId= <a class="code" href="bit__set_8cpp.html#a0">min</a>(otId, transparentOtMax); +00172 <font class="comment">// must invert id, because transparent, sort from back to front</font> +00173 <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.insert( pTransform->getOrderingLayer(), pObs, transparentOtMax-otId ); +00174 } +00175 +00176 } +00177 <font class="comment">// fast floor</font> +00178 <a class="code" href="namespaceNL3D.html#a361">OptFastFloorEnd</a>(); +00179 +00180 +00181 <font class="comment">// Standard traverse (maybe not used)</font> +00182 <font class="comment">// =============================</font> +00183 +00184 <font class="comment">// First traverse the root.</font> +00185 <font class="keywordflow">if</font>(Root) +00186 <a class="code" href="classNL3D_1_1ITrav.html#n0">Root</a>->traverse(NULL); +00187 +00188 +00189 +00190 <font class="comment">// Render Opaque stuff.</font> +00191 <font class="comment">// =============================</font> +00192 +00193 <font class="comment">// TestYoyo</font> +00194 <font class="comment">//OrderOpaqueList.reset(0);</font> +00195 <font class="comment">//OrderTransparentList.reset(0);</font> +00196 +00197 <font class="comment">// Start LodCharacter Manager render.</font> +00198 CLodCharacterManager *clodMngr= <a class="code" href="classNL3D_1_1ITravScene.html#m0">Scene</a>->getLodCharacterManager(); +00199 <font class="keywordflow">if</font>(clodMngr) +00200 clodMngr->beginRender(<a class="code" href="classNL3D_1_1CRenderTrav.html#a2">getDriver</a>(), <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_9">CamPos</a>); +00201 +00202 <font class="comment">// Render the opaque materials</font> +00203 <a class="code" href="classNL3D_1_1CRenderTrav.html#o5">_CurrentPassOpaque</a> = <font class="keyword">true</font>; +00204 <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.begin(); +00205 IBaseRenderObs *pBRO; +00206 <font class="keywordflow">while</font>( <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.get() != NULL ) +00207 { +00208 pBRO = <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.get(); +00209 pBRO->traverse(NULL); +00210 <a class="code" href="classNL3D_1_1CRenderTrav.html#o1">OrderOpaqueList</a>.next(); +00211 } +00212 +00213 <font class="comment">/* Render MeshBlock Manager. </font> +00214 <font class="comment"> Some Meshs may be render per block. Interesting to remove VertexBuffer and Material setup overhead.</font> +00215 <font class="comment"> Faster if rendered before lods, for ZBuffer optimisation: render first near objects then far. </font> +00216 <font class="comment"> Lods are usually far objects.</font> +00217 <font class="comment"> */</font> +00218 <a class="code" href="classNL3D_1_1CRenderTrav.html#z749_0">MeshBlockManager</a>.flush(<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>, <a class="code" href="classNL3D_1_1ITravScene.html#m0">Scene</a>, <font class="keyword">this</font>); +00219 +00220 +00221 <font class="comment">// End LodCharacter Manager render.</font> +00222 <font class="keywordflow">if</font>(clodMngr) +00223 clodMngr->endRender(); +00224 +00225 +00226 <font class="comment">/* Render Scene CoarseMeshManager. </font> +00227 <font class="comment"> Important to render them at end of Opaque rendering, because coarses instances are created/removed during</font> +00228 <font class="comment"> this model opaque rendering pass.</font> +00229 <font class="comment"> */</font> +00230 <font class="comment">// Render dynamic one.</font> +00231 <a class="code" href="classNL3D_1_1ITravScene.html#m0">Scene</a>->getDynamicCoarseMeshManager()->render(<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>); +00232 <font class="comment">// Render static one.</font> +00233 <a class="code" href="classNL3D_1_1ITravScene.html#m0">Scene</a>->getStaticCoarseMeshManager()->render(<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>); +00234 +00235 +00236 <font class="comment">// Render Transparent stuff.</font> +00237 <font class="comment">// =============================</font> +00238 +00239 <font class="comment">// Render transparent materials</font> +00240 <a class="code" href="classNL3D_1_1CRenderTrav.html#o5">_CurrentPassOpaque</a> = <font class="keyword">false</font>; +00241 <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.begin(<a class="code" href="classNL3D_1_1CRenderTrav.html#o6">_LayersRenderingOrder</a>); +00242 <font class="keywordflow">while</font>( <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.get() != NULL ) +00243 { +00244 pBRO = <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.get(); +00245 pBRO->traverse(NULL); +00246 <a class="code" href="classNL3D_1_1CRenderTrav.html#o2">OrderTransparentList</a>.next(); +00247 } +00248 +00249 +00250 <font class="comment">// END!</font> +00251 <font class="comment">// =============================</font> +00252 +00253 <font class="comment">// clean: reset the light setup</font> +00254 <a class="code" href="classNL3D_1_1CRenderTrav.html#z748_1">resetLightSetup</a>(); +00255 +00256 } +00257 <font class="comment">// ***************************************************************************</font> +<a name="l00258"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z746_0">00258</a> <font class="keywordtype">void</font> CRenderTrav::clearRenderList() +00259 { +00260 <a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.clear(); +00261 } +00262 <font class="comment">// ***************************************************************************</font> +<a name="l00263"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z746_1">00263</a> <font class="keywordtype">void</font> CRenderTrav::addRenderObs(IBaseRenderObs *o) +00264 { +00265 <a class="code" href="classNL3D_1_1CRenderTrav.html#o0">RenderList</a>.push_back(o); +00266 } +00267 +00268 +00269 <font class="comment">// ***************************************************************************</font> +<a name="l00270"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z747_0">00270</a> <font class="keywordtype">void</font> CRenderTrav::setSunDirection(<font class="keyword">const</font> CVector &dir) +00271 { +00272 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>= dir; +00273 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>.normalize(); +00274 } +00275 +00276 +00277 <font class="comment">// ***************************************************************************</font> +<a name="l00278"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#a8">00278</a> <font class="keywordtype">void</font> CRenderTrav::setMeshSkinManager(CMeshSkinManager *msm) +00279 { +00280 <a class="code" href="classNL3D_1_1CRenderTrav.html#o7">_MeshSkinManager</a>= msm; +00281 } +00282 +00283 +00284 <font class="comment">// ***************************************************************************</font> +00285 <font class="comment">// ***************************************************************************</font> +00286 <font class="comment">// LightSetup</font> +00287 <font class="comment">// ***************************************************************************</font> +00288 <font class="comment">// ***************************************************************************</font> +00289 +00290 +00291 <font class="comment">// ***************************************************************************</font> +<a name="l00292"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_1">00292</a> <font class="keywordtype">void</font> CRenderTrav::resetLightSetup() +00293 { +00294 <font class="comment">// If lighting System disabled, skip</font> +00295 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_2">LightingSystemEnabled</a>) +00296 { +00297 <font class="comment">// Dont modify Driver lights, but setup default lighting For VertexProgram Lighting.</font> +00298 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>= 1; +00299 <font class="comment">// Setup A default directionnal.</font> +00300 CVector defDir(-0.5f, 0.0, -0.85f); +00301 defDir.normalize(); +00302 CRGBA aday= CRGBA(130, 105, 119); +00303 CRGBA dday= CRGBA(238, 225, 204); +00304 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0].setupDirectional(aday, dday, dday, defDir); +00305 +00306 <font class="keywordflow">return</font>; +00307 } +00308 <font class="keywordflow">else</font> +00309 { +00310 uint i; +00311 +00312 <font class="comment">// Disable all lights.</font> +00313 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->getMaxLight(); i++) +00314 { +00315 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->enableLight(i, <font class="keyword">false</font>); +00316 } +00317 +00318 +00319 <font class="comment">// setup the precise cache, and setup lights according to this cache?</font> +00320 <font class="comment">// setup blackSun (factor==0).</font> +00321 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_3">_LastSunFactor</a>= 0; +00322 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_4">_LastSunAmbient</a>.<a class="code" href="classNLMISC_1_1CRGBA.html#a10">set</a>(0,0,0,255); +00323 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0].setupDirectional(CRGBA::Black, CRGBA::Black, CRGBA::Black, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>); +00324 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setLight(0, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0]); +00325 <font class="comment">// setup NULL point lights (=> cache will fail), so no need to setup other lights in Driver.</font> +00326 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="light__contribution_8h.html#a0">NL3D_MAX_LIGHT_CONTRIBUTION</a>; i++) +00327 { +00328 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_5">_LastPointLight</a>[i]= NULL; +00329 } +00330 +00331 +00332 <font class="comment">// setup the precise cache, and setup lights according to this cache?</font> +00333 <font class="comment">// setup blackSun (factor==0).</font> +00334 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_3">_LastSunFactor</a>= 0; +00335 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_4">_LastSunAmbient</a>.<a class="code" href="classNLMISC_1_1CRGBA.html#a10">set</a>(0,0,0,255); +00336 CLight light; +00337 light.setupDirectional(CRGBA::Black, CRGBA::Black, CRGBA::Black, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>); +00338 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0].setupDirectional(CRGBA::Black, CRGBA::Black, CRGBA::Black, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>); +00339 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setLight(0, light); +00340 <font class="comment">// setup NULL point lights (=> cache will fail), so no need to setup other lights in Driver.</font> +00341 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="light__contribution_8h.html#a0">NL3D_MAX_LIGHT_CONTRIBUTION</a>; i++) +00342 { +00343 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_5">_LastPointLight</a>[i]= NULL; +00344 } +00345 +00346 <font class="comment">// Set the global ambientColor</font> +00347 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setAmbientColor(<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_3">AmbientGlobal</a>); +00348 +00349 +00350 <font class="comment">// clear the cache.</font> +00351 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_0">_CacheLightContribution</a>= NULL; +00352 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>= 0; +00353 +00354 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_11">_StrongestLightTouched</a> = <font class="keyword">true</font>; +00355 } +00356 } +00357 +00358 +00359 <font class="comment">// ***************************************************************************</font> +<a name="l00360"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_2">00360</a> <font class="keywordtype">void</font> CRenderTrav::changeLightSetup(CLightContribution *lightContribution, <font class="keywordtype">bool</font> useLocalAttenuation) +00361 { +00362 <font class="comment">// If lighting System disabled, skip</font> +00363 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_2">LightingSystemEnabled</a>) +00364 <font class="keywordflow">return</font>; +00365 +00366 uint i; +00367 +00368 <font class="comment">// if same lightContribution, no-op.</font> +00369 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_0">_CacheLightContribution</a> == lightContribution && <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_1">_LastLocalAttenuation</a> == useLocalAttenuation) +00370 <font class="keywordflow">return</font>; +00371 <font class="comment">// else, must setup the lights into driver.</font> +00372 <font class="keywordflow">else</font> +00373 { +00374 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_11">_StrongestLightTouched</a> = <font class="keyword">true</font>; +00375 <font class="comment">// if the setup is !NULL</font> +00376 <font class="keywordflow">if</font>(lightContribution) +00377 { +00378 <font class="comment">// Compute SunAmbient / LocalAmbient</font> +00379 <font class="comment">//-----------</font> +00380 CRGBA finalAmbient; +00381 <font class="comment">// Different case if the contribution is frozen or not.</font> +00382 <font class="keywordflow">if</font>(lightContribution->FrozenStaticLightSetup) +00383 { +00384 <font class="comment">// Any FrozenAmbientLight provided??</font> +00385 <font class="keywordflow">if</font>(lightContribution->FrozenAmbientLight) +00386 <font class="comment">// Take his current (maybe animated) ambient</font> +00387 finalAmbient= lightContribution->FrozenAmbientLight->getAmbient(); +00388 <font class="keywordflow">else</font> +00389 <font class="comment">// Take the sun ones.</font> +00390 finalAmbient= <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_4">SunAmbient</a>; +00391 } +00392 <font class="keywordflow">else</font> +00393 { +00394 <font class="comment">// must interpolate between SunAmbient and localAmbient</font> +00395 uint uAmbFactor= lightContribution->LocalAmbient.<a class="code" href="classNLMISC_1_1CRGBA.html#m3">A</a>; +00396 <font class="comment">// expand 0..255 to 0..256, to avoid loss of precision.</font> +00397 uAmbFactor+= uAmbFactor>>7; +00398 <font class="comment">// Blend, but LocalAmbient.r/g/b is already multiplied by a.</font> +00399 finalAmbient.modulateFromuiRGBOnly(<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_4">SunAmbient</a>, 256 - uAmbFactor); +00400 finalAmbient.addRGBOnly(finalAmbient, lightContribution->LocalAmbient); +00401 } +00402 <font class="comment">// Force Alpha to 255 for good cache test.</font> +00403 finalAmbient.A= 255; +00404 +00405 +00406 <font class="comment">// Setup the directionnal Sunlight.</font> +00407 <font class="comment">//-----------</font> +00408 <font class="comment">// expand 0..255 to 0..256, to avoid loss of precision.</font> +00409 uint ufactor= lightContribution->SunContribution; +00410 <font class="comment">// different SunLight as in cache ??</font> +00411 <font class="comment">// NB: sunSetup can't change during renderPass, so need only to test factor.</font> +00412 <font class="keywordflow">if</font>(ufactor != <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_3">_LastSunFactor</a> || finalAmbient != <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_4">_LastSunAmbient</a>) +00413 { +00414 <font class="comment">// cache (before expanding!!)</font> +00415 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_3">_LastSunFactor</a>= ufactor; +00416 <font class="comment">// Cache final ambient light</font> +00417 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_4">_LastSunAmbient</a>= finalAmbient; +00418 +00419 <font class="comment">// expand to 0..256.</font> +00420 ufactor+= ufactor>>7; <font class="comment">// add 0 or 1.</font> +00421 <font class="comment">// modulate color with factor of the lightContribution.</font> +00422 CRGBA sunDiffuse, sunSpecular; +00423 sunDiffuse.<a class="code" href="classNLMISC_1_1CRGBA.html#z321_1">modulateFromuiRGBOnly</a>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_5">SunDiffuse</a>, ufactor); +00424 sunSpecular.modulateFromuiRGBOnly(<a class="code" href="classNL3D_1_1CRenderTrav.html#z747_6">SunSpecular</a>, ufactor); +00425 <font class="comment">// setup driver light</font> +00426 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0].setupDirectional(finalAmbient, sunDiffuse, sunSpecular, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_8">_SunDirection</a>); +00427 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setLight(0, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0]); +00428 } +00429 +00430 +00431 <font class="comment">// Setup other point lights</font> +00432 <font class="comment">//-----------</font> +00433 uint plId=0; +00434 <font class="comment">// for the list of light.</font> +00435 <font class="keywordflow">while</font>(lightContribution->PointLight[plId]!=NULL) +00436 { +00437 CPointLight *pl= lightContribution->PointLight[plId]; +00438 uint inf; +00439 <font class="keywordflow">if</font>(useLocalAttenuation) +00440 inf= lightContribution->Factor[plId]; +00441 <font class="keywordflow">else</font> +00442 inf= lightContribution->AttFactor[plId]; +00443 +00444 <font class="comment">// different PointLight setup than in cache??</font> +00445 <font class="comment">// NB: pointLight setup can't change during renderPass, so need only to test pointer, </font> +00446 <font class="comment">// attenuation mode and factor.</font> +00447 <font class="keywordflow">if</font>( pl!=<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_5">_LastPointLight</a>[plId] || +00448 inf!=<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_6">_LastPointLightFactor</a>[plId] || +00449 useLocalAttenuation!=<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_7">_LastPointLightLocalAttenuation</a>[plId] ) +00450 { +00451 <font class="comment">// need to resetup the light. Cache it.</font> +00452 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_5">_LastPointLight</a>[plId]= pl; +00453 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_6">_LastPointLightFactor</a>[plId]= inf; +00454 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_7">_LastPointLightLocalAttenuation</a>[plId]= useLocalAttenuation; +00455 +00456 <font class="comment">// compute the driver light</font> +00457 <font class="keywordflow">if</font>(useLocalAttenuation) +00458 pl->setupDriverLight(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[plId+1], inf); +00459 <font class="keywordflow">else</font> +00460 <font class="comment">// Compute it with user Attenuation</font> +00461 pl->setupDriverLightUserAttenuation(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[plId+1], inf); +00462 +00463 <font class="comment">// setup driver. decal+1 because of sun.</font> +00464 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setLight(plId+1, <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[plId+1]); +00465 } +00466 +00467 <font class="comment">// next light?</font> +00468 plId++; +00469 <font class="keywordflow">if</font>(plId>=<a class="code" href="light__contribution_8h.html#a0">NL3D_MAX_LIGHT_CONTRIBUTION</a>) +00470 <font class="keywordflow">break</font>; +00471 } +00472 +00473 +00474 <font class="comment">// Disable olds, enable news, and cache.</font> +00475 <font class="comment">//-----------</font> +00476 <font class="comment">// count new number of light enabled.</font> +00477 uint newNumLightEnabled; +00478 <font class="comment">// number of pointLight + the sun </font> +00479 newNumLightEnabled= plId + 1; +00480 +00481 <font class="comment">// enable lights which are used now and were not before.</font> +00482 <font class="keywordflow">for</font>(i=<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>; i<newNumLightEnabled; i++) +00483 { +00484 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->enableLight(i, <font class="keyword">true</font>); +00485 } +00486 +00487 <font class="comment">// disable lights which are no more used.</font> +00488 <font class="keywordflow">for</font>(i=newNumLightEnabled; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>; i++) +00489 { +00490 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->enableLight(i, <font class="keyword">false</font>); +00491 } +00492 +00493 <font class="comment">// cache the setup.</font> +00494 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_0">_CacheLightContribution</a> = lightContribution; +00495 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>= newNumLightEnabled; +00496 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_1">_LastLocalAttenuation</a>= useLocalAttenuation; +00497 } +00498 <font class="keywordflow">else</font> +00499 { +00500 <font class="comment">// Disable old lights, and cache.</font> +00501 <font class="comment">//-----------</font> +00502 <font class="comment">// disable lights which are no more used.</font> +00503 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>; i++) +00504 { +00505 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->enableLight(i, <font class="keyword">false</font>); +00506 } +00507 +00508 <font class="comment">// cache the setup.</font> +00509 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_0">_CacheLightContribution</a> = NULL; +00510 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>= 0; +00511 } +00512 +00513 +00514 } +00515 } +00516 +00517 <font class="comment">// ***************************************************************************</font> +00518 <font class="comment">// ***************************************************************************</font> +00519 <font class="comment">// VertexProgram LightSetup</font> +00520 <font class="comment">// ***************************************************************************</font> +00521 <font class="comment">// ***************************************************************************</font> +00522 +00523 +00524 <font class="comment">// ***************************************************************************</font> +<a name="l00525"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_3">00525</a> <font class="keywordtype">void</font> CRenderTrav::beginVPLightSetup(uint ctStart, <font class="keywordtype">bool</font> supportSpecular, <font class="keyword">const</font> CMatrix &invObjectWM) +00526 { +00527 uint i; +00528 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>==4); +00529 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>= <a class="code" href="bit__set_8cpp.html#a0">min</a>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>, (uint)<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>); +00530 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>= ctStart; +00531 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_14">_VPSupportSpecular</a>= supportSpecular; +00532 +00533 <font class="comment">// Prepare Colors (to be multiplied by material)</font> +00534 <font class="comment">//================</font> +00535 <font class="comment">// Ambient. _VPCurrentCtStart+0</font> +00536 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_15">_VPFinalAmbient</a>= <a class="code" href="classNL3D_1_1CRenderTrav.html#z747_3">AmbientGlobal</a>; +00537 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00538 { +00539 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_15">_VPFinalAmbient</a>+= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[i].getAmbiant(); +00540 } +00541 <font class="comment">// Diffuse. _VPCurrentCtStart+1 to 4</font> +00542 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00543 { +00544 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[i]= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[i].getDiffuse(); +00545 } +00546 <font class="comment">// reset other to 0.</font> +00547 <font class="keywordflow">for</font>(; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>; i++) +00548 { +00549 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[i]= CRGBA::Black; +00550 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+1+i, 0.f, 0.f, 0.f, 0.f); +00551 } +00552 <font class="comment">// Specular. _VPCurrentCtStart+5 to 8 (only if supportSpecular)</font> +00553 <font class="keywordflow">if</font>(supportSpecular) +00554 { +00555 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00556 { +00557 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[i]= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[i].getSpecular(); +00558 } +00559 <font class="comment">// reset other to 0.</font> +00560 <font class="keywordflow">for</font>(; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>; i++) +00561 { +00562 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[i]= CRGBA::Black; +00563 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+5+i, 0.f, 0.f, 0.f, 0.f); +00564 } +00565 } +00566 +00567 +00568 <font class="comment">// Compute Eye position in Object space.</font> +00569 CVector eye= invObjectWM * <a class="code" href="classNL3D_1_1ITravCameraScene.html#z877_9">CamPos</a>; +00570 +00571 +00572 <font class="comment">// Setup Sun Directionnal light.</font> +00573 <font class="comment">//================</font> +00574 CVector lightDir; +00575 <font class="comment">// in objectSpace.</font> +00576 lightDir= invObjectWM.mulVector(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[0].getDirection()); +00577 lightDir.normalize(); +00578 lightDir= -lightDir; +00579 <font class="keywordflow">if</font>(supportSpecular) +00580 { +00581 <font class="comment">// Setup lightDir.</font> +00582 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+9, lightDir); +00583 } +00584 <font class="keywordflow">else</font> +00585 { +00586 <font class="comment">// Setup lightDir. NB: no specular color!</font> +00587 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+5, lightDir); +00588 } +00589 +00590 +00591 <font class="comment">// Setup PointLights</font> +00592 <font class="comment">//================</font> +00593 uint startPLPos; +00594 <font class="keywordflow">if</font>(supportSpecular) +00595 { +00596 <font class="comment">// Setup eye in objectSpace for localViewer</font> +00597 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+11, eye); +00598 <font class="comment">// Start at 12.</font> +00599 startPLPos= 12; +00600 } +00601 <font class="keywordflow">else</font> +00602 { +00603 <font class="comment">// Start at 6.</font> +00604 startPLPos= 6; +00605 } +00606 <font class="comment">// For all pointLight enabled (other are black: don't matter)</font> +00607 <font class="keywordflow">for</font>(i=1; i<<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00608 { +00609 <font class="comment">// Setup position of light.</font> +00610 CVector lightPos; +00611 lightPos= invObjectWM * <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_9">_DriverLight</a>[i].getPosition(); +00612 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+startPLPos+(i-1), lightPos); +00613 } +00614 +00615 +00616 <font class="comment">// Must force real light setup at least the first time, in changeVPLightSetupMaterial()</font> +00617 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_20">_VPMaterialCacheDirty</a>= <font class="keyword">true</font>; +00618 } +00619 +00620 <font class="comment">// ***************************************************************************</font> +<a name="l00621"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_4">00621</a> <font class="keywordtype">void</font> CRenderTrav::changeVPLightSetupMaterial(<font class="keyword">const</font> CMaterial &mat, <font class="keywordtype">bool</font> excludeStrongest) +00622 { +00623 <font class="comment">// Must test if at least done one time.</font> +00624 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_20">_VPMaterialCacheDirty</a>) +00625 { +00626 <font class="comment">// Must test if same as in cache</font> +00627 <font class="keywordflow">if</font>( <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_21">_VPMaterialCacheEmissive</a> == mat.getEmissive().getPacked() && +00628 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_22">_VPMaterialCacheAmbient</a> == mat.getAmbient().getPacked() && +00629 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_23">_VPMaterialCacheDiffuse</a> == mat.getDiffuse().getPacked() ) +00630 { +00631 <font class="comment">// Same Diffuse part, test if same specular if necessary</font> +00632 <font class="keywordflow">if</font>( !<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_14">_VPSupportSpecular</a> || +00633 ( <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_24">_VPMaterialCacheSpecular</a> == mat.getSpecular().getPacked() && +00634 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_25">_VPMaterialCacheShininess</a> == mat.getShininess() ) ) +00635 { +00636 <font class="comment">// Then ok, skip.</font> +00637 <font class="keywordflow">return</font>; +00638 } +00639 } +00640 } +00641 +00642 <font class="comment">// If not skiped, cache now. cache all for simplification</font> +00643 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_20">_VPMaterialCacheDirty</a>= <font class="keyword">false</font>; +00644 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_21">_VPMaterialCacheEmissive</a>= mat.getEmissive().getPacked(); +00645 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_22">_VPMaterialCacheAmbient</a>= mat.getDiffuse().getPacked(); +00646 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_23">_VPMaterialCacheDiffuse</a>= mat.getDiffuse().getPacked(); +00647 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_24">_VPMaterialCacheSpecular</a>= mat.getSpecular().getPacked(); +00648 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_25">_VPMaterialCacheShininess</a>= mat.getShininess(); +00649 +00650 <font class="comment">// Setup constants</font> +00651 CRGBAF color; +00652 uint i; +00653 CRGBAF matDiff= mat.getDiffuse(); +00654 CRGBAF matSpec= mat.getSpecular(); +00655 <font class="keywordtype">float</font> specExp= mat.getShininess(); +00656 +00657 uint strongestLightIndex = excludeStrongest ? <a class="code" href="classNL3D_1_1CRenderTrav.html#z748_6">getStrongestLightIndex</a>() : <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; +00658 +00659 <font class="comment">// setup Ambient + Emissive</font> +00660 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_15">_VPFinalAmbient</a> * mat.getAmbient(); +00661 color+= mat.getEmissive(); +00662 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+0, 1, &color.R); +00663 +00664 +00665 <font class="comment">// is the strongest light is not excluded, its index should have been setup to _VPNumLights</font> +00666 +00667 <font class="comment">// setup Diffuse.</font> +00668 <font class="keywordflow">for</font>(i = 0; i < strongestLightIndex; ++i) +00669 { +00670 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[i] * matDiff; +00671 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+1+i, 1, &color.R); +00672 } +00673 +00674 +00675 <font class="keywordflow">if</font> (i != <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>) +00676 { +00677 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[i] * matDiff; +00678 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_18">_StrongestLightDiffuse</a>.<a class="code" href="classNLMISC_1_1CRGBA.html#a10">set</a>((uint8) (255.f * color.R), (uint8) (255.f * color.G), (uint8) (255.f * color.B), (uint8) (255.f * color.A)); +00679 <font class="comment">// setup strongest light to black for the gouraud part</font> +00680 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a> + 1 + i, 0.f, 0.f, 0.f, 0.f); +00681 ++i; +00682 <font class="comment">// setup other lights</font> +00683 <font class="keywordflow">for</font>(; i < <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00684 { +00685 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[i] * matDiff; +00686 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a> + 1 + i, 1, &color.R); +00687 } +00688 } +00689 +00690 <font class="comment">// setup Specular</font> +00691 <font class="keywordflow">if</font>(_VPSupportSpecular) +00692 { +00693 <font class="keywordflow">for</font>(i = 0; i < strongestLightIndex; ++i) +00694 { +00695 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[i] * matSpec; +00696 color.<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a>= specExp; +00697 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+5+i, 1, &color.R); +00698 } +00699 +00700 <font class="keywordflow">if</font> (i != <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>) +00701 { +00702 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[i] * matSpec; +00703 <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_19">_StrongestLightSpecular</a>.<a class="code" href="classNLMISC_1_1CRGBA.html#a10">set</a>((uint8) (255.f * color.R), (uint8) (255.f * color.G), (uint8) (255.f * color.B), (uint8) (255.f * color.A)); +00704 +00705 <font class="comment">// setup strongest light to black (for gouraud part)</font> +00706 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a> + 5 + i, 0.f, 0.f, 0.f, 0.f); +00707 ++i; +00708 <font class="comment">// setup other lights</font> +00709 <font class="keywordflow">for</font>(; i < <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_13">_VPNumLights</a>; i++) +00710 { +00711 color= <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[i] * matSpec; +00712 color.<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a>= specExp; +00713 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a> + 5 + i, 1, &color.R); +00714 } +00715 } +00716 } +00717 +00718 <font class="comment">// setup alpha.</font> +00719 <font class="keyword">static</font> <font class="keywordtype">float</font> alphaCte[4]= {0,0,1,0}; +00720 alphaCte[3]= matDiff.A; +00721 <font class="comment">// setup at good place</font> +00722 <font class="keywordflow">if</font>(_VPSupportSpecular) +00723 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+10, 1, alphaCte); +00724 <font class="keywordflow">else</font> +00725 <a class="code" href="classNL3D_1_1CRenderTrav.html#o3">Driver</a>->setConstant(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_12">_VPCurrentCtStart</a>+9, 1, alphaCte); +00726 } +00727 +00728 <font class="comment">// ***************************************************************************</font> +<a name="l00729"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_6">00729</a> sint CRenderTrav::getStrongestLightIndex()<font class="keyword"> const</font> +00730 <font class="keyword"></font>{ +00731 <font class="keywordflow">if</font> (!<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_11">_StrongestLightTouched</a>) <font class="keywordflow">return</font> -1; +00732 uint vpNumLights = <a class="code" href="bit__set_8cpp.html#a0">min</a>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z750_2">_NumLightEnabled</a>, (uint)<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>); +00733 <font class="comment">// If there is only a directionnal light, use it</font> +00734 <font class="comment">// If there is any point light, use the nearest, or the directionnal light if it is brighter</font> +00735 <font class="keywordflow">if</font> (vpNumLights == 0) <font class="keywordflow">return</font> -1; +00736 <font class="keywordflow">if</font> (vpNumLights == 1) <font class="keywordflow">return</font> 0; +00737 <font class="comment">// First point light is brightest ?</font> +00738 <font class="keywordtype">float</font> lumDir = <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m0">R</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m1">G</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m2">B</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a> +00739 + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m0">R</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m1">G</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m2">B</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[0].<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a>; +00740 <font class="keywordtype">float</font> lumOmni = <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m0">R</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m1">G</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m2">B</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_16">_VPLightDiffuse</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a> +00741 + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m0">R</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m1">G</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m2">B</a> + <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_17">_VPLightSpecular</a>[1].<a class="code" href="classNLMISC_1_1CRGBAF.html#m3">A</a>; +00742 <font class="keywordflow">return</font> lumDir > lumOmni ? 0 : 1; +00743 } +00744 +00745 <font class="comment">// ***************************************************************************</font> +<a name="l00746"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_7">00746</a> <font class="keywordtype">void</font> CRenderTrav::getStrongestLightColors(<a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> &diffuse, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> &specular) +00747 { +00748 sint strongestLightIndex = <a class="code" href="classNL3D_1_1CRenderTrav.html#z748_6">getStrongestLightIndex</a>(); +00749 <font class="keywordflow">if</font> (strongestLightIndex == -1) +00750 { +00751 diffuse = specular = <a class="code" href="classNLMISC_1_1CRGBA.html#p0">NLMISC::CRGBA::Black</a>; +00752 } +00753 <font class="keywordflow">else</font> +00754 { +00755 diffuse = <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_18">_StrongestLightDiffuse</a>; +00756 specular = <a class="code" href="classNL3D_1_1CRenderTrav.html#z750_19">_StrongestLightSpecular</a>; +00757 } +00758 } +00759 +00760 +00761 <font class="comment">// ***************************************************************************</font> +00762 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a225">LightingVPFragmentNormalize</a>= +00763 <font class="stringliteral">" # normalize normal \n\</font> +00764 <font class="stringliteral"> DP3 R6.w, R6, R6; \n\</font> +00765 <font class="stringliteral"> RSQ R6.w, R6.w; \n\</font> +00766 <font class="stringliteral"> MUL R6, R6, R6.w; \n\</font> +00767 <font class="stringliteral">"</font>; +00768 +00769 +00770 <font class="comment">// ***************************************************************************</font> +00771 <font class="comment">// NB: all CTS+x are replaced with good cte index.</font> +00772 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a226">LightingVPFragmentNoSpecular_Begin</a>= +00773 <font class="stringliteral">" \n\</font> +00774 <font class="stringliteral"> # Global Ambient. \n\</font> +00775 <font class="stringliteral"> MOV R2, c[CTS+0]; \n\</font> +00776 <font class="stringliteral"> \n\</font> +00777 <font class="stringliteral"> # Diffuse Sun \n\</font> +00778 <font class="stringliteral"> DP3 R0.x, R6, c[CTS+5]; # R0.x= normal*-lightDir \n\</font> +00779 <font class="stringliteral"> LIT R0.y, R0.xxxx; # R0.y= R0.x clamped \n\</font> +00780 <font class="stringliteral"> MAD R2, R0.y, c[CTS+1], R2; # R2= summed vertex color. \n\</font> +00781 <font class="stringliteral">"</font>; +00782 +00783 <font class="comment">// The 3 point Light code.</font> +00784 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a227">LightingVPFragmentNoSpecular_PL</a>[]= +00785 { +00786 <font class="stringliteral">" # Diffuse PointLight 0. \n\</font> +00787 <font class="stringliteral"> ADD R0, c[CTS+6], -R5; # R0= lightPos-vertex \n\</font> +00788 <font class="stringliteral"> DP3 R0.w, R0, R0; # normalize R0. \n\</font> +00789 <font class="stringliteral"> RSQ R0.w, R0.w; \n\</font> +00790 <font class="stringliteral"> MUL R0, R0, R0.w; \n\</font> +00791 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00792 <font class="stringliteral"> LIT R0.y, R0.xxxx; # R0.y= R0.x clamped \n\</font> +00793 <font class="stringliteral"> MAD R2, R0.y, c[CTS+2], R2; # R2= summed vertex color. \n\</font> +00794 <font class="stringliteral">"</font>, +00795 <font class="stringliteral">" # Diffuse PointLight 1. \n\</font> +00796 <font class="stringliteral"> ADD R0, c[CTS+7], -R5; # R0= lightPos-vertex \n\</font> +00797 <font class="stringliteral"> DP3 R0.w, R0, R0; # normalize R0. \n\</font> +00798 <font class="stringliteral"> RSQ R0.w, R0.w; \n\</font> +00799 <font class="stringliteral"> MUL R0, R0, R0.w; \n\</font> +00800 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00801 <font class="stringliteral"> LIT R0.y, R0; # R0.y= R0.x clamped \n\</font> +00802 <font class="stringliteral"> MAD R2, R0.y, c[CTS+3], R2; # R2= summed vertex color. \n\</font> +00803 <font class="stringliteral">"</font>, +00804 <font class="stringliteral">" # Diffuse PointLight 2. \n\</font> +00805 <font class="stringliteral"> ADD R0, c[CTS+8], -R5; # R0= lightPos-vertex \n\</font> +00806 <font class="stringliteral"> DP3 R0.w, R0, R0; # normalize R0. \n\</font> +00807 <font class="stringliteral"> RSQ R0.w, R0.w; \n\</font> +00808 <font class="stringliteral"> MUL R0, R0, R0.w; \n\</font> +00809 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00810 <font class="stringliteral"> LIT R0.y, R0; # R0.y= R0.x clamped \n\</font> +00811 <font class="stringliteral"> MAD R2, R0.y, c[CTS+4], R2; # R2= summed vertex color. \n\</font> +00812 <font class="stringliteral">"</font> +00813 }; +00814 +00815 <font class="comment">// The End code.</font> +00816 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a228">LightingVPFragmentNoSpecular_End</a>= +00817 <font class="stringliteral">" # output to o[COL0] only, replacing alpha with material alpha. \n\</font> +00818 <font class="stringliteral"> MAD o[COL0], R2, c[CTS+9].zzzx, c[CTS+9].xxxw; \n\</font> +00819 <font class="stringliteral">"</font>; +00820 +00821 +00822 <font class="comment">// ***************************************************************************</font> +00823 <font class="comment">// NB: all CTS+x are replaced with good cte index.</font> +00824 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a229">LightingVPFragmentSpecular_Begin</a>= +00825 <font class="stringliteral">" \n\</font> +00826 <font class="stringliteral"> # Global Ambient. \n\</font> +00827 <font class="stringliteral"> MOV R2, c[CTS+0]; \n\</font> +00828 <font class="stringliteral"> \n\</font> +00829 <font class="stringliteral"> # Always keep Specular exponent in R0.w \n\</font> +00830 <font class="stringliteral"> MOV R0.w, c[CTS+5].w; \n\</font> +00831 <font class="stringliteral"> \n\</font> +00832 <font class="stringliteral"> # Compute vertex-to-eye vector normed. \n\</font> +00833 <font class="stringliteral"> ADD R4, c[CTS+11], -R5; \n\</font> +00834 <font class="stringliteral"> DP3 R4.w, R4, R4; \n\</font> +00835 <font class="stringliteral"> RSQ R4.w, R4.w; \n\</font> +00836 <font class="stringliteral"> MUL R4, R4, R4.w; \n\</font> +00837 <font class="stringliteral"> \n\</font> +00838 <font class="stringliteral"> # Diffuse-Specular Sun \n\</font> +00839 <font class="stringliteral"> # Compute R1= halfAngleVector= (lightDir+R4).normed(). \n\</font> +00840 <font class="stringliteral"> ADD R1.xyz, c[CTS+9], R4; # R1= halfAngleVector \n\</font> +00841 <font class="stringliteral"> DP3 R1.w, R1, R1; # normalize R1. \n\</font> +00842 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00843 <font class="stringliteral"> MUL R1.xyz, R1, R1.w; \n\</font> +00844 <font class="stringliteral"> # Compute Factors and colors. \n\</font> +00845 <font class="stringliteral"> DP3 R0.x, R6, c[CTS+9]; # R0.x= normal*-lightDir \n\</font> +00846 <font class="stringliteral"> DP3 R0.yz, R6, R1; # R0.yz= normal*halfAngleVector \n\</font> +00847 <font class="stringliteral"> LIT R0.yz, R0; # R0.y= R0.x clamped, R0.z= pow(spec, R0.w) clamp \n\</font> +00848 <font class="stringliteral"> MAD R2, R0.y, c[CTS+1], R2; # R2= summed vertex color. \n\</font> +00849 <font class="stringliteral"> MUL R3, R0.z, c[CTS+5]; # R3= specular color. \n\</font> +00850 <font class="stringliteral">"</font>; +00851 +00852 <font class="comment">// The 3 point Light code.</font> +00853 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a230">LightingVPFragmentSpecular_PL</a>[]= +00854 { +00855 <font class="stringliteral">" # Diffuse-Specular PointLight 0. \n\</font> +00856 <font class="stringliteral"> # Compute R0= (lightPos-vertex).normed(). \n\</font> +00857 <font class="stringliteral"> ADD R0.xyz, c[CTS+12], -R5; # R0= lightPos-vertex \n\</font> +00858 <font class="stringliteral"> DP3 R1.w, R0, R0; # normalize R0. \n\</font> +00859 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00860 <font class="stringliteral"> MUL R0.xyz, R0, R1.w; \n\</font> +00861 <font class="stringliteral"> # Compute R1= halfAngleVector= (R0+R4).normed(). \n\</font> +00862 <font class="stringliteral"> ADD R1.xyz, R0, R4; # R1= halfAngleVector \n\</font> +00863 <font class="stringliteral"> DP3 R1.w, R1, R1; # normalize R1. \n\</font> +00864 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00865 <font class="stringliteral"> MUL R1.xyz, R1, R1.w; \n\</font> +00866 <font class="stringliteral"> # Compute Factors and colors. \n\</font> +00867 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00868 <font class="stringliteral"> DP3 R0.yz, R6, R1; # R0.yz= normal*halfAngleVector \n\</font> +00869 <font class="stringliteral"> LIT R0.yz, R0; # R0.y= R0.x clamped, R0.z= pow(spec, R0.w) clamp \n\</font> +00870 <font class="stringliteral"> MAD R2, R0.y, c[CTS+2], R2; # R2= summed vertex color. \n\</font> +00871 <font class="stringliteral"> MAD R3, R0.z, c[CTS+6], R3; # R3= summed specular color. \n\</font> +00872 <font class="stringliteral">"</font>, +00873 <font class="stringliteral">" # Diffuse-Specular PointLight 1. \n\</font> +00874 <font class="stringliteral"> # Compute R0= (lightPos-vertex).normed(). \n\</font> +00875 <font class="stringliteral"> ADD R0.xyz, c[CTS+13], -R5; # R0= lightPos-vertex \n\</font> +00876 <font class="stringliteral"> DP3 R1.w, R0, R0; # normalize R0. \n\</font> +00877 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00878 <font class="stringliteral"> MUL R0.xyz, R0, R1.w; \n\</font> +00879 <font class="stringliteral"> # Compute R1= halfAngleVector= (R0+R4).normed(). \n\</font> +00880 <font class="stringliteral"> ADD R1.xyz, R0, R4; # R1= halfAngleVector \n\</font> +00881 <font class="stringliteral"> DP3 R1.w, R1, R1; # normalize R1. \n\</font> +00882 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00883 <font class="stringliteral"> MUL R1.xyz, R1, R1.w; \n\</font> +00884 <font class="stringliteral"> # Compute Factors and colors. \n\</font> +00885 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00886 <font class="stringliteral"> DP3 R0.yz, R6, R1; # R0.yz= normal*halfAngleVector \n\</font> +00887 <font class="stringliteral"> LIT R0.yz, R0; # R0.y= R0.x clamped, R0.z= pow(spec, R0.w) clamp \n\</font> +00888 <font class="stringliteral"> MAD R2, R0.y, c[CTS+3], R2; # R2= summed vertex color. \n\</font> +00889 <font class="stringliteral"> MAD R3, R0.z, c[CTS+7], R3; # R3= summed specular color. \n\</font> +00890 <font class="stringliteral">"</font>, +00891 <font class="stringliteral">" # Diffuse-Specular PointLight 2. \n\</font> +00892 <font class="stringliteral"> # Compute R0= (lightPos-vertex).normed(). \n\</font> +00893 <font class="stringliteral"> ADD R0.xyz, c[CTS+14], -R5; # R0= lightPos-vertex \n\</font> +00894 <font class="stringliteral"> DP3 R1.w, R0, R0; # normalize R0. \n\</font> +00895 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00896 <font class="stringliteral"> MUL R0.xyz, R0, R1.w; \n\</font> +00897 <font class="stringliteral"> # Compute R1= halfAngleVector= (R0+R4).normed(). \n\</font> +00898 <font class="stringliteral"> ADD R1.xyz, R0, R4; # R1= halfAngleVector \n\</font> +00899 <font class="stringliteral"> DP3 R1.w, R1, R1; # normalize R1. \n\</font> +00900 <font class="stringliteral"> RSQ R1.w, R1.w; \n\</font> +00901 <font class="stringliteral"> MUL R1.xyz, R1, R1.w; \n\</font> +00902 <font class="stringliteral"> # Compute Factors and colors. \n\</font> +00903 <font class="stringliteral"> DP3 R0.x, R6, R0; # R0.x= normal*lightDir \n\</font> +00904 <font class="stringliteral"> DP3 R0.yz, R6, R1; # R0.yz= normal*halfAngleVector \n\</font> +00905 <font class="stringliteral"> LIT R0.yz, R0; # R0.y= R0.x clamped, R0.z= pow(spec, R0.w) clamp \n\</font> +00906 <font class="stringliteral"> MAD R2, R0.y, c[CTS+4], R2; # R2= summed vertex color. \n\</font> +00907 <font class="stringliteral">"</font> +00908 }; +00909 +00910 +00911 <font class="comment">// The End code.</font> +00912 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="namespaceNL3D.html#a231">LightingVPFragmentSpecular_End</a>= +00913 <font class="stringliteral">" # output directly to secondary color. \n\</font> +00914 <font class="stringliteral"> MAD o[COL1], R0.z, c[CTS+8], R3; # final summed specular color. \n\</font> +00915 <font class="stringliteral"> \n\</font> +00916 <font class="stringliteral"> # output diffuse to o[COL0], replacing alpha with material alpha. \n\</font> +00917 <font class="stringliteral"> MAD o[COL0], R2, c[CTS+10].zzzx, c[CTS+10].xxxw; \n\</font> +00918 <font class="stringliteral">"</font>; +00919 +00920 <font class="comment">// ***************************************************************************</font> +00921 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a456">strReplaceAll</a>(string &strInOut, <font class="keyword">const</font> string &tokenSrc, <font class="keyword">const</font> string &tokenDst) +00922 { +00923 uint32 pos; +00924 sint srcLen= tokenSrc.size(); +00925 <font class="keywordflow">while</font>( (pos=strInOut.find(tokenSrc)) != string::npos) +00926 { +00927 strInOut.replace(pos, srcLen, tokenDst); +00928 } +00929 } +00930 +00931 <font class="comment">// ***************************************************************************</font> +<a name="l00932"></a><a class="code" href="classNL3D_1_1CRenderTrav.html#z748_9">00932</a> std::string CRenderTrav::getLightVPFragment(uint numActivePointLights, uint ctStart, <font class="keywordtype">bool</font> supportSpecular, <font class="keywordtype">bool</font> normalize) +00933 { +00934 string ret; +00935 +00936 <font class="comment">// Code frag written for 4 light max.</font> +00937 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>==4); +00938 <a class="code" href="debug_8h.html#a6">nlassert</a>(numActivePointLights<=<a class="code" href="classNL3D_1_1CRenderTrav.html#z748_0s0">MaxVPLight</a>-1); +00939 +00940 <font class="comment">// Add LightingVPFragmentNormalize fragment?</font> +00941 <font class="keywordflow">if</font>(normalize) +00942 ret+= <a class="code" href="namespaceNL3D.html#a225">LightingVPFragmentNormalize</a>; +00943 +00944 <font class="comment">// Which fragment to use...</font> +00945 <font class="keywordflow">if</font>(supportSpecular) +00946 { +00947 <font class="comment">// Add start of VP.</font> +00948 ret+= <a class="code" href="namespaceNL3D.html#a229">LightingVPFragmentSpecular_Begin</a>; +00949 +00950 <font class="comment">// Add needed pointLights.</font> +00951 <font class="keywordflow">for</font>(uint i=0;i<numActivePointLights;i++) +00952 { +00953 ret+= <a class="code" href="namespaceNL3D.html#a230">LightingVPFragmentSpecular_PL</a>[i]; +00954 } +00955 +00956 <font class="comment">// Add end of VP.</font> +00957 ret+= <a class="code" href="namespaceNL3D.html#a231">LightingVPFragmentSpecular_End</a>; +00958 } +00959 <font class="keywordflow">else</font> +00960 { +00961 <font class="comment">// Add start of VP.</font> +00962 ret+= <a class="code" href="namespaceNL3D.html#a226">LightingVPFragmentNoSpecular_Begin</a>; +00963 +00964 <font class="comment">// Add needed pointLights.</font> +00965 <font class="keywordflow">for</font>(uint i=0;i<numActivePointLights;i++) +00966 { +00967 ret+= <a class="code" href="namespaceNL3D.html#a227">LightingVPFragmentNoSpecular_PL</a>[i]; +00968 } +00969 +00970 <font class="comment">// Add end of VP.</font> +00971 ret+= <a class="code" href="namespaceNL3D.html#a228">LightingVPFragmentNoSpecular_End</a>; +00972 } +00973 +00974 <font class="comment">// Replace all CTS+x with good index. do it for 15 possible indices: 0 to 14 if specular.</font> +00975 <font class="comment">// run from 14 to 0 so CTS+14 will not be taken for a CTS+1 !!</font> +00976 <font class="keywordflow">for</font>(sint i=14; i>=0; i--) +00977 { +00978 <font class="keywordtype">char</font> tokenSrc[256]; +00979 sprintf(tokenSrc, <font class="stringliteral">"CTS+%d"</font>, i); +00980 <font class="keywordtype">char</font> tokenDst[256]; +00981 sprintf(tokenDst, <font class="stringliteral">"%d"</font>, ctStart+i); +00982 <font class="comment">// replace all in the string</font> +00983 <a class="code" href="namespaceNL3D.html#a456">strReplaceAll</a>(ret, tokenSrc, tokenDst); +00984 } +00985 +00986 <font class="comment">// verify no CTS+ leaved... (not all ctes parsed!!!)</font> +00987 <a class="code" href="debug_8h.html#a6">nlassert</a>( ret.find(<font class="stringliteral">"CTS+"</font>)==string::npos ); +00988 +00989 <font class="keywordflow">return</font> ret; +00990 } +00991 +00992 +00993 } +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |