<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:1.0px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1.0px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea { border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 1.0em; padding:2px;}
.tabContents {padding:1.0em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.0em 0.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding-top:5px; padding-left:3px; padding-right:3px;}
table.listView {font-size:0.85em; margin:10px 10px;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
Used the [[Simple and Fast Fluids|Simple and Fast Fluids]] method for the velocity field and [[MacCormack Advection|MacCormack Advection]] for the 3D smoke. Rendered the smoke with a basic raycasting technic and it runs in real-time. Simulation dimensions are 128^3.

<html><iframe width="640" height="390" src="http://www.youtube.com/embed/V4Er6VApdPI" frameborder="0" allowfullscreen></iframe></html>
[<img[ADE|Images/ADESmall.jpg]]
<br> <br>
Alternating Direction Explicit (ADE) is both explicit and unconditionally stable with accuracy O(dt, dx^2) for the time-varying convection-diffusion equation. It is formulated on a regular grid and consists in traversing the grid in alternate directions in order to compensate for the errors in the solution. It was orignally proposed in 1 dimension and this work extends it to 2 and more dimensions. 

Symbolic computation was used  to derive the scheme and the presentation at the converence was given during the Symbolic and Numeric Computation in the Study of Nonlinear Differential and Difference Equations session. (PDF Soon)

Helped building the new game engine for this RTS PC title which is based on the Game of Thrones series written by [[George R. R. Martin|http://grrm.livejournal.com/166992.html]]. Here is the [[Game Site|http://www.agot-genesis.com/index.php?rub=game]].
<html><img src="Images/Me.jpg" style="width:300px;"/></a></html>

This page is deprecated, I am now working on character animation in the IMAGINE team at INRIA Grenoble. 

Here is my  new [[page|https://team.inria.fr/imagine/martin-guay/]] 

<html>
<img src="Images/Cloth.png" style="height:150px;"/> <img src="Images/SimpleParticles.png" style="height:150px;"/>  <img src="Images/SPH.png" style="height:150px;"/>  </html>

The first project I worked on when I arrived at Cyanide's Montreal-based studio. We did some work related to the porting of the game to the Xbox360.  [[Game site|http://www.bloodbowl-game.com/]]

[img[BloodBowl|Images/BB.jpg]]
[img[Brachistochrone|Images/Brachistochrone.jpg]]

The problem gets more difficult when the curvature of the solution (green) changes and the "curve goes back up". But for points that are not too far ( y:(1,0) and x(Pi/2,0) ), this does not happen and the solution is a curve that never goes back up.

First intialize the solution with an initial guess of y=x (black line) and the optimization is done over the interior x_i points. The number N(11 in the graphic) of x_i points can be augmented to get nearer the analytical solution. 

[[Scilab file|Images/Brachistochrone.sci]]
[[Reference|http://www.stanford.edu/~wshao/brach_numerical.pdf]]

[[My CV|Images/Martin Guay CV.pdf]] as of may 2011. 
The Catenary, or hanging chain, problem is useful to help understand trajectory optimization. It consists in minimizing the potential energy of the chain under the constraint that the rope's length remains the same. It is a good idea to start with this problem because there is actually an analytical solution available from variational calculus with which it is possible to compare with your computed solution. Essentially, I propose here a simple method to solve the problem in reasonable times without using any external libraries or software.

Technique in short:
#Simple gradient descent as to minimize the discrete energy functional.
#Newton.Raphson as to satisfy the nonlinear equality constraint which can be seen as a variation of quadratic constraint penalization. I saw this Newton.Raphson method in the "Position Based Dynamics" literature.

I wrote an informal [[tutorial|Images/Catenary.pdf]] describing this approach in greater detail. 

<html>
<iframe width="640" height="390" src="http://www.youtube.com/embed/3nqMPQ5hrI8" frameborder="0" allowfullscreen></iframe>
</html>

To be noted, the solution was not compared with the analytical Catenary Problem's solution obtainable with variational calculus, therefore it may not be the "trully" optimal solution.


Cloth Simulation using Position Based Dynamics (with no self-intersection for the moment). This simulation has 45x45 nodes and runs on a CPU. The PBD approach consists in minizing energy contraints (Bending, Strech, etc...) directly with respect to the positions instead of the traditional velocity intermediate step of a physics simulation.

<html>
<iframe width="640" height="390" src="http://www.youtube.com/embed/IzDxbRPFKu8" frameborder="0" allowfullscreen></iframe>
</html>
It's a bit tougher than we may think to actually get a cloud simulation running. A few concepts such as potential temperature are absolutely crucial to the well being of the simulation.  I used the paper of harris in 2003 with higher order advection (MacCormack) and ended up with the following result:

<html><iframe width="640" height="390" src="http://www.youtube.com/embed/6ODcKPO4akc?hl=fr&fs=1" frameborder="0" allowfullscreen></iframe></html>.
[[About]]
[[Publications]]

Used deferred shading for rendering gaseous phenomena such as clouds.


<html>
<img src="Images/Cloud.png" style="width:640px;"/></a></html>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
Little projects for fun or for learning. Everything runs in real-time. I wrote some tutorials for a few of the demos and if you have any questions about the details, feel free to ask.

Postion Based Dynamics simulation of [[Cloth]]
[[Deferred Shading]]
[[Post Process Anti-Aliasing|FXAA]]
[[3D Smoke]] Simulation with Raycasting Rendering. (Just the basics)
Basic 2D Eulerian [[Cloud|Clouds]] Dynamics Simulation
[[Catenary]] Problem Solved with Nonlinear Optimization. (only 1-day of work with simple techniques in plain C++)
[[Brachistochrone]] Problem Solved with Nonlinear Optimization using Scilab
Basic Lagrangian [[SPH Particle-Based Fluid Simulation]]
[[MacCormack Advection]] Method
[[Finite Element|FEM Soft Bodies]] Method for Soft Bodies 
Surface tracking [[Level Set|Level Set Method]] Method
Basic Eulerian [[Grid-Based Fluid|Grid-Based Fluid Simulation]] Simulation
[[Screen Space Ambient Occlusion|SSAO]]

<html>
<img src="Images/Broken Pipe.png" style="width:470px;"/></html>

A basic FEM soft body solver.  The trick is to generate a "good" mesh.

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/92XRbcfyQW8" frameborder="0" allowfullscreen></iframe>
</html>
After a while, aliased images become irrating. I wanted to use a method method that would allow me to perform [[deferred shading|Deferred Shading]] and other post processes. I implemented the method from NVDIA [[(FXAA)|http://timothylottes.blogspot.com/2011/03/nvidia-fxaa.html]] which is not perfect, but it does a good job most of the time and is quite simple to implement.  I hope to find the courage to make a video showing off the benefits, but in the meantime, I show the effect a little bit in this [[video|Cloth]] and we can't see much without HD...

<html>
<img src="Images/FXAA.png" style="width:640px;"/></a></html>
The method described in Realistic Animation of Liquids.

<html>
<object width="640" height="390"><param name="movie" value="http://www.youtube.com/v/pvvnH5pBd4E&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/pvvnH5pBd4E&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="390"></embed></object>
</html>
Using the zero'th level set of a scalar function for surface tracking was a popular technique several years ago.  As we can see, it's basic implementation has issues regarding multi resolution sampling; simulating the scalar field on a fine grid over a coarser fluid simulation grid.

<html>
<object width="640" height="390"><param name="movie" value="http://www.youtube.com/v/nVV418rzFQQ&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/nVV418rzFQQ&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="390"></embed></object>
</html>
[[Simple and Fast Fluid Solver on the GPU.]]
[[Level Set Method for interface evolution]]
[[SSAO]]
[[Inflow and surface boundaries]]


The MacCormack method used with 2 intermediate Semi-Lagrangian building blocks is unconditionnally stable and has 2nd order accuracy both in space and time. The fluid simulation is the one described in [[Simple and Fast Fluids|Simple and Fast Fluids]].  This little testing led me create [[Screen Space Fire Animations|Screen Space Fire]].

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/uW6h_FIlE1k" frameborder="0" allowfullscreen></iframe>
</html>
 <html><a
  href="javascript:void(0)"
  onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList())"
 >Home</a></html>
[[Publications]]
[[Video Games|Video Games]]
[[Template|WhatIsThis?]]





Animation de phénomènes gazeux basé sur la simulation d'un modèle de fluide à phase unique sur le GPU. [[PDF|Articles/MemoireGuay.pdf]]
I recently moved to France. Here is a link to the [[MAVERICK|http://maverick.inria.fr/]] research group at INRIA in which i am currently working in.




We did this game when completing the D.E.S.S. in video game programming at campus ubisoft.  2007-2008.

[img[Panne Seche | Images/PS.jpg]]
[img[WireFrame | Images/PSW.jpg]]
Check out the interactive fire for [[menus demo|MacCormack Advection]], it runs at 3000fps.  The [[fluid simulation|Simple and Fast Fluids]] is a single pass shader which looks like a simple post process.     
[[Simple and Fast Fluids]]
[[ADE Method]] for the convection-diffusion equation
[[Screen Space Fire]]
|<html><center><img src="Images/SSF/SSF_Bunnies.png" height="180" />  </center></html>|[[Screen Space Animation of Fire|Screen Space Fire]], ACM SIGGRAPH Asia 2011 Technical Sketches.  [[PDF|Images/ScreenSpaceFire.pdf]]|2011|

|<html><center><img src="Images/SFF/Density.png" height="130" />  </center></html>|[[Simple and Fast Fluids]] in GPU Pro 2: Advanced Rendering Techniques, A. K. Peters, 2011.  [[PDF|http://hal.inria.fr/docs/00/59/60/50/PDF/PreprintSFFGuayColinEgli.pdf]]  [[Code|Images/SFF/DemosSFF.zip]] |2011|

|<html><center><img src="Images/ADE/ADESmall.jpg" height="135" /></center> </html>|Extensions to higher dimensions of an [[ADE Method]] for the unsteady convection-diffusion equation,7th IMACS International Conference on Nonlinear Evolution Equations and Wave Phenomena: Computation and Theory in Athens, Georgia, (U.S.A.). [[PDF Tech Report|Images/ADETechReport.pdf]] |2011|

I will be assisting this year's SIGGRAPH conference.
This is a from the Weakly Compressible SPH version:

<html>
<iframe width="640" height="390" src="http://www.youtube.com/embed/q2s7WikKJdI" frameborder="0" allowfullscreen></iframe>
</html>

And the next one is my first attempt at an SPH simulation was done quite rapidely and had many issues:

<html>
<iframe width="640" height="390" src="http://www.youtube.com/embed/MPQCRUC6sI0" frameborder="0" allowfullscreen></iframe>
</html>
Screen Space Ambient Occlusion is a great solution to real-time shadows as well as being quite simple to implement.   [[Pseudo-code|http://www.shalinor.com/research.html]].

<html><object width="640" height="390"><param name="movie" value="http://www.youtube.com/v/IxyRPQb16DY&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/IxyRPQb16DY&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="390"></embed></object></html>
When the camera moves, it appears as if it were actually the objects that were moving. To ensure temporal consistency, we tried a correction approach which consists in reprojecting the density field along the previous camera's transformations. 

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/RDjZFzLRne8" frameborder="0" allowfullscreen></iframe>
</html>
<html><img src="Images/SSF/SSF_Teaser.png" height="195" /></html>

Simple and physically inspired method to animate realistically looking fire directly in 2D instead of along a 3D simulation. This naturally reduces the complexity of the animation from O(n3) to O(n2). The fire is represented as a 2D scalar density field located on a plane facing the camera, and is advected under a 2.5D velocity field. In our method, the apparent motion of the fire on the viewing axis is mimicked by introducing vibrations in the velocity field. We model these rapid vibrations as pressure waves found in compressible fluids and therefore consider the full Navier-Stokes equations. The equations can be solved in a single pass and our method entirely runs on the GPU. A natural extension is to make use of this method directly in screen space: instead of filtering down the fire’s simulation grid in world space, we rasterize the fire’s source, and perform the simulation on a coarser grid directly in screen space.
The results are constantly renewed 3D-looking fires computed solely in 2D.

Demo video (better in HD):

<html>
<iframe title="YouTube video player" width="640" height="390" hd="1" src="http://www.youtube.com/embed/ORrnHwY2Id4" frameborder="0" allowfullscreen></iframe>
</html>

And with moving objects:

<html>
<iframe title="YouTube video player" width="640" height="390" hd="1" src="http://www.youtube.com/embed/US85_viKWRc" frameborder="0" allowfullscreen></iframe>
</html>

Note it is better to use it on individual quads for each fires, but I tried using a global 2D grid holding all the fires as it is straightforward to use, but it has [[temporal consistency issues|SSF Temporal Consistency]]. 

/% <<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>> %/
This paper illustrates a simple and efficient algorithm for the simulation of fluid flow directly on the GPU using a single pixel shader. By temporarily relaxing the incompressibility condition, we are able to solve the full Navier[[-]]Stokes&nbsp;equations over the domain in a single pass.  The code holds in less then 40 lines and is so simple we actually had the solver running in {{{FxComposer}}}.  ({{{DirectX9}}}, shader model 2_a)

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/PScfTOKbSpU" frameborder="0" allowfullscreen></iframe>
</html>

Solving every fluid cell (texel) locally in a single pass is not only simple, but also quite fast. In fact, the implementation of this algorithm on the GPU is orders of magnitude [[faster]] than on the CPU.  

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/mUsNMstkWCE" frameborder="0" allowfullscreen></iframe>
</html>

The drawback is the use of explicit finite difference schemes to solve the&nbsp;Navier[[-]]Stokes equations and is therefore only conditionally stable; meaning the time step value has an upper bound defined by a ratio relative to the spatial resolution over the solution's range.  See [[CFL condition|http://en.wikipedia.org/wiki/Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition]] for explicit integration schemes. 

Nevertheless by visualizing the fluid with particles instead of solving an other PDE for a scalar smoke density, we could use relatively larger time steps (ex: t=0.5f, dx=1) and create neat motion efficiently in 3D.  This is done over a 32x32x32 velocity grid and visualized with 100k particles where the actual bottleneck is the particles rendering!

<html>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/EsuG5E8Auxk" frameborder="0" allowfullscreen></iframe>
</html>


- Computer Animation -
Martin Guay
|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
Worked in the video game industry for a couple of years and did a few student projects involving games:

|<html><center><img src="Images/AGOT2.jpg" height="130" />  </center></html>| [[AGOT Genesis|AGOT RTS]]  at Cyanide Studio in Montreal | PC | 2009-2010 |
|<html><center><img src="Images/iSurf0.jpg" height="130" />  </center></html>| [[iSurf]]  at Cyanide Studio in Montreal | iPhone/iPodTouch | 2008-2009 |
|<html><center><img src="Images/BB.jpg" height="130" />  </center></html>| [[BloodBowl]]  at Cyanide Studio in Montreal | Xbox360 | 2008 |
|<html><center><img src="Images/PS.jpg" height="130" />  </center></html>| [[PanneSeche]] as a student racing game | PC | 2007 |


<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
This website setup is the easiest thing I know. It's called [[TiddlyWiki | http://www.tiddlywiki.com/]]. 
The simulation runs on the CPU at 8.5 fps with 4 threads on an intel Core 2 Quad @ 2.66 GHz simulating only the velocity field over a 256x256 grid. Keeping the same grid size, the simulation runs at more than 12800 fps on a Geforce 9800 GT using 32-bit floating point render targets. 
Coded the hole iSurf game for iPhone/iPodTouch over a period of 6 months while working at Cyanide Studio in Montreal.   

[img[In Game | Images/iSurf0.jpg]]
[img[In Game | Images/iSurf1.jpg]]
[img[Menu | Images/iSurf2.jpg]]
[img[Menu | Images/iSurf3.jpg]]