<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>http://www.tharlevfx.com/about</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2017-07-17</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/professional-portfolio</loc>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
    <lastmod>2022-12-08</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/personal</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-06-15</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/hand-animation</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-10-13</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1539451379895-8L8LJDVMVD4LLUZXZ49G/256PixelFire.gif</image:loc>
      <image:title>Hand Animation</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1443054075837-MT1CPRRNCYVL8GYGD05Q/image-asset.gif</image:loc>
      <image:title>Hand Animation</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1428263217850-NZP0INIPN3RG1D5JRHVP/image-asset.gif</image:loc>
      <image:title>Hand Animation</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1421038548494-I1QAGQ5QFCYQ4OQM2MGW/image-asset.gif</image:loc>
      <image:title>Hand Animation</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-marketplace</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-09</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-4-world-position-offset</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-09-18</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477310919257-FUJ3I9C9M3TULV5QKCZN/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Vertex Paint Finally the last common input for the WPO node is Vertex Painting - here we've just multiplied the Red channel by the Vertex Normal (the preview cube defaults to White vertex colour or 1,1,1).  Try applying this to plane and painting it in engine - basically what we've created is a very simple sculpting tool!  Now we're not about to start replacing Zbrush but this is great for things like ground surfaces or water surfaces where you just want to make a few little adjustments in engine.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477310589136-2HCEJ68ML58UHUSY3NP7/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Vertex Normal So far we've just been moving things in the World Space axes - what about something more specific to the object?  Here we're just using the Vertex Normals as our multiplier to our Sine Node - an oscillating exploding box!  Maybe not super realistic but could make for some sort of cool Sci-Fi hologram.  What about if we Abs our Sine input?  or Frac it?  or combine it with the World Space technique from above?  There's almost infinite combinations of things we can do and results we can achieve, we just have to work out the Maths!</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477310475428-9HKJ3RXS4UCFWXHE4HCD/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Sine Wave So the Sine Wave is a good start but what if we want some variation across our mesh?  Well we know a technique for creating variation from our Vector tutorial - World Position.  If we mask off a channel and add that to our Time we get a nice Sine wave motion moving through the world.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477309881960-MIAB10QYXW0YQI9UTBK9/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Move Here we've just simply plugged a Vector3 into our WPO input.  Notice how the preview cube moves up in the Z axis?  Basically whatever Vector3 we plug in here will offset our vertices in the X,Y,Z axis.  Pretty cool and incredibly powerful for VFX work.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477310790330-J2YF46F7SAXG6P3RCC1F/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Texture Well actually we don't always have to do that Math - we can use a texture!  Since DX11 we've been able to use Textures in the Vertex shader and here we're scrolling a simple Clouds Noise through our object - not that impressive but hopefully you can see the potential in authoring Heightmaps for your models - combining this with masks you can create all sorts of effects.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477310001757-QH1XZAA0JN6GIKOX7U6T/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 World Position Offset</image:title>
      <image:caption>Sine So moving things is a good start but what we really want is some animation - here I've just taken a simple Time&gt;Sine setup and multiplied by 0,0,50 to just get movement in the Z axis.  The result - a very simple bouncing box!  This kind of procedural animation is incredibly cheap compared to regular skinned animation and really powerful.  If you remember back to our discussion regarding the difference between the pixel and vertex shader, this animation is happening in the vertex shader, so we're limited by the number of verts in our mesh - basically if you want smoother curves you need more geometry.   Note there is a World Displacement input that does a very similar thing to World Position Offset but using tessellation to dynamically create intermediate verts when required and then a Heightmap to control the movement, but that's out of scope of this tutorial.  (https://docs.unrealengine.com/latest/INT/Resources/ContentExamples/MaterialNodes/1_11/)</image:caption>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-4-material-vectors</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-09-18</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477216727988-UIR8NWT61223W7MYJFBN/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Reflection Vector This node outputs a direction vector that represents the Camera direction reflected across the surface normal.  Basically if we fired an imaginary line from the camera how would it bounce off the surface.  If we mask off the RG channels what does it remind you of?  If you said UV layout you'd be correct! - If we plug this node into a Texture Sample we get some pretty convincing reflections (the texture is just one I captured from the Particle Cave example map).</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477218267470-EBOLXRQVWTQ2NK7FIWHM/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Fresnel So now we know a bit about some vectors lets use on in a slightly more practical example.  Here we're using a Dot to do a comparison between the Camera Vector and 0,0,1, Transformed to Tangent space.  It sounds complicated but hopefully from the preview we can see what's happening:  The 0,0,1 Transformed to local is just the surface normal, and when we Dot two vectors we're basically doing a comparison - we get White when they're aligned and Black when they're perpendicular, so in this case we're getting a Fresnel effect (named after a French mathematician and pronounced Frenell).  Helpfully Unreal has provided two Fresnel nodes which have this same functionality, one simple and one complex.   How do things change if we do our Dot between the Camera and the Pixel or Vertex Normals instead?  What about if we have the Normal map plugged in too?  Maybe we could even plug the Normal map into the Transform Node?  Try all the different combinations and see what effects they have.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477219393947-ERGINWOORU7724UY0D9K/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Procedural Texturing So now we understand our Position Nodes lets use them in a couple of practical examples - Firstly we're taking the Object position and plugging it into the Time input of a Panner Node - Now when we move the object around in the Y axis (because we've just masked off the G channel) the texture scrolls around the object.  This is a great technique for adding positional variation to materials - you could for example take a dirt overlay map and use this technique so that if you had multiple copies of the same mesh next to each other, each would appear to be be slightly different due to having different offsets on the Dirt map.  Note this can only be used on static objects - if things are moving then this effect would break, unless that's the effect you're after (rotating wheels on a background object car for example could be done cheaply with a shader like this etc.)  Secondly we have something similar but sort of opposite - here we're taking the RG channels of the World Position and plugging them into the UV's of a Texture - basically what we're doing is a projection mapping from the top down direction.  This kind of technique is really useful for things like Terrain or Water where we know the surface will always be facing up and allows us to use different size and shape meshes and ensure that they always Tile correctly and don't create seams etc.  Similarly if we wanted to create scrolling raindrops on a variety of surfaces this would be better done mapped to World Space so the UV's and scale of the meshes didn't matter.  Again this only really works if the Mesh is static, although you could do something like mapping a smoke Texture to World Space and then apply that to a flashlight light shaft - then when the player moves the light it will look like the smoke is in the world.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477216909193-CLCITKYJM6H5N88MPGG2/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Up Vector Here we've manually specified a 0,0,1 Vector and we want to use it as a vertical Direction Vector rather than the colour blue.  By default everything that plugs into the Material pins should be in World Space so by Transforming the Vector from Tangent to World we get the up vector mapped over the surface.  If we just mask out the blue channel hopefully we can see why this would be useful - it creates a mask that always points up regardless of the objects orientation - really useful for things like snow deposit or moss shaders.   A quick aside on Spaces - World Space is just the basic Unreal grid, with 0,0,0 in the centre and the X,Y,Z axis aligned with Up, Left/Right and Forwards/Backwards.  Local Space is unique to each object - 0,0,0 is the origin of the mesh and X,Y,Z are aligned to the mesh as it was exported from the 3D modelling package.  Tangent Space is related to the surface with 0,0,1 being the Normal direction, directly off the surface at 90 degrees to the face.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477218924254-V8F4WIMH277UCDW1QCH3/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Absolute World Position So far we've mostly been looking at Direction Vectors so lets take a look at a position Vector:  Absolute World Position.  The first thing you'll notice if you plug the World Position directly into Emissive is the massive bloom - Position Vectors are outputted in World Space units so the numbers get very high very quickly - if we Clamp it down we can start to see what's happening, or better yet just divide by a large number to get useful ranges.  Here the World Position coordinate of each pixel is being output - if we mask off just the G channel hopefully we can see this a bit easier.  Note you might need to move the object around in the world to see this effect clearer.   Underneath we have Object Position - this Node is very similar but outputs a single Positional value, based on the objects origin, rather than different values per pixel.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477217674563-UKB6164ID3YKYOBA93N4/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Pixel and Vertex Normals Firstly here we need to make sure that the material is using the Default Lit shading model and then connect the Normal Map to the Normal pin.  Now when we connect the PixelNormalWS the Normal map is taken into account and each pixels normal direction is displayed.  Compared that to the VertexNormalWS node - we're still seeing some shading from the Normal map but the Vertex normal isn't being affected.  Note the WS just stands for World Space and is a helpful reminder what space the data is in.   Another quick aside on rendering - the way the engine draws meshes is a two step process: the Vertex Shader and the Pixel Shader (also sometimes referred to as the Fragment Shader).  Firstly the engine takes all the Vertex positions and creates a triangulated mesh using those positions, then it fills those triangles in with Pixels.  This example, hopefully, illustrates that in action - the Normal map is affecting the Pixel shader but the Vertex normals remain unaffected.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477215803012-MLDTYGAGA0UXZTOEVQJP/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Vectors</image:title>
      <image:caption>Camera Vector This isn't the most useful vector but hopefully displays some of the key concepts I've mentioned above.  Basically this node outputs the current direction of the Camera as a Unit vector.  Notice how the object changes colours as the camera orbits around and points in different directions.  Often with vectors it's only one channel we're interested in so here I've masked off the R channel, and Abs to ensure positive values - notice how the object goes completely White when the camera is aligned with the X axis.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-4-uv-tricks</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-09-18</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477046962494-XHOMRFQIH8SM2TTUQIJ4/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Notice here that we've used a Texture Sample, and masked it to a Vector2, instead of a UV layout.  It's just two gradients I've created in Photoshop but we're getting a really noisey result - so what gives?  Basically compression is the issue here - Textures in Unreal are compressed to save memory but UV's are very sensitive to change so we're seeing those compression artifacts.  Note if you just want a gradient it's cheaper and more accurate to mask a UV sample rather than importing a texture, you might remember I used this technique in the Math examples.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477047768484-KJDVRTM4R8RQEQV8L496/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>So now we know that UV's are just Mathematical gradients, what happens when we start adding numbers to them.  Well, as you might have guessed, they move!  Adding numbers to R moves things horizontally, G vertically.  So what happens if we add a changing value, such as Time - a scrolling texture! and how about if we just want to scroll in a single axis?  Simple, just add the Time to a single channel.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048467833-0OPCXFWI1LU12XMVOGBA/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Here we've just plugged a Time Sine into our Panner to create an oscillating texture, but we're not getting a tiling effect of the black and white repeating like we'd expect.  So what gives?  Here the trick is in the texture - if you double click it and open it's settings and click the drop down to extend the Texture section there are options for X and Y-Axis Tiling Methods.  In this case we've set this to Clamp so rather than Tiling the Texture the Engine just repeats the last pixel, which in our case is pure black or pure white - creating this sliding door effect.  Super useful.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048122821-2QGZ9BDYYMU7IJHZYJUF/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>So now we're getting to some interesting things - what happens if we scroll a texture and add it to our UV layout.  Well with this kind of mask we get a strange bulging effect, very cool.  Note we've had to scale the texture right down, UV's are very sensitive remember.  This is super useful and the basis for all sorts of VFX work - water, fire, cloth etc.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477049004639-T6GMK243IBFKN7BRZS97/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Lastly you've probably noticed the TexCoord[0] in the Name of the Node. Well TexCoord is just Unreals name for UV and is a shortened version of Texture Coordinate.  The [0] refers to UV layout 0 - it's really useful to unwrap a model in multiple ways and keep them all in the model for different uses - for example a Character might have a large tiling unwrap for things like cloth detail normals and then another unwrap that is just a front Planar projection which allows for a quick way to paint mud kickup on the bottom of the trouser leg etc.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477046389707-G8SSK987NOCDFAXRM89A/UV_UVs.jpg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>UVs Firstly I've just plugged the UV output into the emissive node and we get Reds, Yellows and Greens.  What's going on?  Well if we use our Mask node and break out the channels we can see it's actually just a black to white gradient in the red and green channels and blue doesn't exist. - UV's are a Vector 2.   Basically what we have here is a lookup table - each of the pixels in the layout is uniquely identified by it's red and green component and that tells the engine what pixel to refer to from the texture the UV layout is plugged into.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048816365-AQ739Y65482YWX5JCZS9/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Here we're plugging a texture, masked to a Vec2, into our fake UV layout from earlier - so what's happening.  Well if you remember the Black and White values of a UV layout are just a lookup table.  So here the Black and White Vec2 mask we're using is just being remapped to the colours of the second texture - exactly like the Gradient feature works in Photoshop.  This is super useful for things like Fire where we can use lots of different black and white masks to create our shape and motion and then use the same gradient on all our fires to ensure a consistent colour and allow for quick and easy editing.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477046850051-GYDUYSQBJ6Y6QPJ6GNGG/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Here we're just using the UV node as most of you will already know how - plugging it into a Texture Sample.  Unreal automatically assumes default UV values if this node isn't connected so you may never have needed to connect like this before.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477047266319-UZP68LSJ49V3SPOZQGFV/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>These next three nodes are just showing how Tiling works - All the UV nodes are setup with a Tiling of 4,4.  Notice when the first Node is connected you're seeing a lot of blooming Yellow, this might remind you of something from the Math example - Unreal is trying to display numbers over 1, so if we Frac it down we can see the gradient is repeating over the layout.  Note the whole number part of a UV layout is totally ignored, only the fractional part is relevant.  This is the reason that textures tile.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048714069-NZUQ7A0BJES4H7VEQJ7X/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>A bit less useful but included for the sake of completeness - there's also an option to Mirror UV's instead of Tile or Clamp.  Here we've created a circle but if we inspect the texture we can see it's actually just a quarter of a circle.  Could be useful in certain circumstances.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048018972-7S8TZ4TMMVYX79B9S0MJ/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Similar to the Panner is the Rotator.  This is doing much more complex math but basically it's doing the same thing, just changing the input UV values mathematically to create a rotation motion.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477048252381-58S1KFV9IMMEGV9QLYVR/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Here's another example where we're just adding a simple noise texture to our UV's - it almost looks like we're looking at the texture through a water surface.  Note the White values on the right hand side of the image - here the texture has wrapped around from the left.  Because we're adding values in both axis the noise is going to move things up and right - maybe not a problem if we're dealing with a tiling texture but if we do want to keep things centred that's easy enough - just subtract 0.5 from out input noise before we multiply and add - now our texture range goes from 0 - 1 to -0.5 - 0.5 so the noise equally adds and subtracts from the UV's and keep the image centred.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477047873004-RFGTPT5L7VEH6NH360NF/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>So what we've created here is what Unreal refers to as a Panner node - but it's basically doing the same thing, just moving the UV's over time by adding values to the U and V channel.  Notice that if we plug a constant value into the Time input of the Panner we get control over the movement without any scrolling, useful to directly control your material offsets.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1477047171880-LOMJ4QA0B3M8FAZLIT49/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 UV Tricks</image:title>
      <image:caption>Note there's no reason that a texture has to tile uniformly - here I've set up a tiling of 1,0.1 so only the first column of the texture is visible.  This can be useful for things like packing multiple textures into one sheet or for creating a long texture and then un-stretching it in the material so only a fraction is visible at a time.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-4-material-editor-math</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-09-18</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476986163997-XSWRWGCEF2PWBZZKYXXN/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Multiply/Divide Used just as much as add and subtract and the same limitations for Vector length apply.   Again each channel is multiplied separately so 1,0,0 * 0,1,0 = 0,0,0 or Red * Green = Black. Useful for combining mask or for tinting colours - set up a tint by multiplying by a Vector Parameter set to default at 1,1,1</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476988608717-SJU6VQFU7JJ051FHF93O/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Append This node is basically the opposite to the Mask node we covered earlier.  It take two inputs and outputs them combined, such as in the example where we're combining three scalar values into a Vector 3 or Colour.   Another indispensable node when working with Scalars and Vectors.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476987206047-SNPXHZCII28X7JPDAFFF/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Abs or Absolute The absolute of a value just means to take the value and make it positive, ignoring any negatives.  I.e. abs(-4) = 4 This is occasionally useful when creating masks using complex math or for creating a bouncing motion from a Sine wave.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476987682888-9FOBCVYA9V2FL5Q1XIAG/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Ceil, Floor and Frac These three nodes are similar:  Ceil or Ceiling takes an input and returns the next integer rounding up, Floor does the same but rounding down and Frac or Fraction just returns the floating point part of the value.  (quick aside on terminology: an Integer is a whole number ie, 1,3,-2 etc. a Floating Point or Float is a number with a decimal i.e. 1.25, 3.5 etc.  generally in shaders we only use Floats and not Ints, unlike in Code or Blueprints) Note in the example I've taken a gradient from a UV layout (I'll get to this in the next tutorial) and multiplied it by 5 to get a larger range.  Unreal doesn't have bloom in the material editor so the preview only shows White even though the values are over 1.  After the Ceil or Floor I divide back by 5 to get a visible result.  Note the Black in the Floor example and the White in the Ceil, due to rounding down and up.   Frac is the most useful here generally returning repeating values from something like Time or Sine but Floor and Ceil have their uses too.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476986376937-4J74U99D0R47LPLUJYGR/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>OneMinus This is basically a special case node that is the same as using a Subtract Node but included for legacy/convenience reasons.   Simply it just takes the input away from 1 - this has the result of inverting a black and white mask. Note this doesn't need to take a Clamped input but values over 1 when OneMinus'd will result in negative numbers which might not be desired.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476985799621-ICI8WW1Y4X52ZFJ3UH4Z/Add%2FSubtract</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Add/Subtract The most basic functions but used all the time in Shader writing.  Note you can add a 3 Channel Vector to a Scalar but not add a 3 Channel to a 2 Channel.  Adding a Scalar to a Vector just adds the Scalar value to every value in the Vector. (quick aside on terminology:  a Vector is anything containing more than one value - 2, 3, or 4.  A Scalar is just a single value.  Colours are a 3 channel vector: RGB or a 4 channel vector RGBA - trying to do maths between vectors of different lengths with often create errors but Unreal will inform you when this is the case.) Each channel is added separately so 1,0,0 + 0,1,0 = 1,1,0 or Red + Green = Yellow to put it in colour terms.   Useful for combining masks or for overlaying a glowing part of a material.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476987304491-1BQHBT1G90ACOOGYTJUI/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Mask and Clamp There are two new nodes here - Mask and Clamp.  Mask just takes an input vector and only outputs some of its components - in this case it's taking the RGB of the texture and just outputting the R value.  Clamp similarly takes an input value and Clamps the output to a specified range, in this case 0-0.5.  Any values above of below the range are just discarded and the Max/Min is returned.   Both of these are super useful and used all the time for splitting Vectors into smaller components or ensuring values don't fall out of a useful range, for example before Powering or Lerping.  Note we could have just pulled a wire off the Red pin of the Texture instead of using the Mask node.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476988299166-N18YU2T7OQ8E53MLM6SJ/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Lerp or Linear Interpolate Now we're talking - this node just takes two inputs and blends between them, based on an input value (0-1).  Values of 0 will result in input A and values of 1 input B.  This is a real workhorse of a node in shader writing, being used all the time for any manner of things.  Try plugging the Time Sine Abs nodes into the Alpha input.   Note this will accept values greater than 1 into the Alpha and will just extrapolate out linearly from the inputs it's given.  This can be useful, if you're using a Black input in A for example, when the results make sense, but Lerping between two colours, such as here, would probably give  undesirable results with values over 1 - try it and see what happens.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476986522921-ZVNCQ8HYRZHD9GW8AJK4/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Fmod - Floating Point Remainder This is a more obscure math function and one that I personally hardly every use.  It returns the floating point remainder of a division.  Which in this example means that 4.4 is divided by 2, which goes 2 full times, and the 0.4 remainder is returned.   Can be useful for returning repeating fractional parts of a Time or Sine function but i tend to use Frac for that (which we'll cover shortly).</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476986839124-I45M6ZL9NWRAL8H66DUA/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Power Something to the power of 2, or x^2 as it's written, means x multiplied by itself 2 times.  This has the effect of creating more contrast in an image, as values close to black (0) get smaller proportionally more than values close to white (1).  Note values over 1 will get larger as they are being multiplied by values over 1, and also anything to the Power of 0 is technically infinite (or not a number) which will create HUGE bloom if it accidentally gets into your Shader. Very useful node for controlling contrast and falloff of masks.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476989081244-E5HREA28XA17ENASW2QF/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Masking Finally no new nodes but an example of how we can combine a few math nodes to create a nice soft masking effect - here we're subtracting some input value from our noise texture and then clamping back to remove any negative numbers we've created.  Finally we multiply by the reciprocal or our input value to remap the range back to 0-1.   This is a super useful technique for creating easily controllable soft edge masks from a texture.  Similarly if we wanted to harden up the mask we could multiply by a value and then clamp 0-1 again and remove anything over 1, resulting in a harder mask, but keeping the soft edges, compared to using an If node - try it out for yourself.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476988075366-H7R0BQSBLJA86DVBJZKX/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>IF This node looks more complex due to having more inputs but really is quite simple.  Basically it compares two input values A and B and returns a different input value if A&gt;B (A is greater than B) or if A&lt;B.  There is also a special case for A=B which is basically never really needed in shader writing (it defaults to A=&gt;B if this pin is unconnected.) Try connecting the Time Sine Abs nodes to the B input to see how this animates.   This node is somewhat useful - generally better used to mask areas off due to the hard edge it creates.  I'll show you a better method for creating nice soft masks later in the tutorial.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476988760808-3WSNMFQ9F7PTS6VJ9YSE/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Time and Sine/Cosine The Time node returns the current game time in milliseconds - very useful for creating animated shaders.  Generally we have to process this somehow to create a repeating value so we don't just have values that get bigger indefinitely.  This is usually done with a Frac, to get a repeating 0-1, or with a Sine, to get a oscillating -1 to 1.  Combining two or three Sine waves, with different periods, together can create a very believable approximation to random motion.   Note the Constant Bias Scale node - this is basically just an Add and Multiply node combined into a single node for ease of use.  The default settings of 1, 0.5 remap the -1 to 1 range of a Sine wave to 0-1, personally I don't use them often as you can't see the values inside the node from the shader network view, making it harder to read the shader but it's up to you.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1476987521474-0VBD73AVUT4Z881L9ZH5/image-asset.jpeg</image:loc>
      <image:title>Unreal 4 Material Editor Math</image:title>
      <image:caption>Max and Min Two comparison nodes which return the Maximum or Minimum of the two inputs per pixel.   Useful for creating strange masks, such as seen here, or for creating pseudo random motion - for example on a graphic equaliser shader you could take the Max of two out of phase Sine waves to create semi realistic pseudo random movement.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/reference-video-collection</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2019-01-09</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/shader-competitions</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2017-06-22</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1489615782992-1TTVS3N85H9KV5PCC21O/Snow+Shader</image:loc>
      <image:title>Shader Competitions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1498137616909-S6QXT3HA0WRII3BCJ45J/Candy_Render.jpg</image:loc>
      <image:title>Shader Competitions</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/python-scripts</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2022-05-31</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/timelines-and-triggers</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-04</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747067383-20IAFTJE5O0UIA7QPOGR/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747088455-KI3CRSUABS1U5OBDFS4M/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747098818-JH3YSM7W68MC3SWX25NN/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747111268-XWD1C29TLLY73LP27CI3/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747048206-B62KLX5GFFW0AO68KX0K/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747122837-J042GOVC7JVDJV5B57VR/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747059823-HELA6SRK1MQ0QBT9AFYX/image-asset.jpeg</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747077328-8J5SGS8AD4JX31Z5R226/02_RandomStart.JPG</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519747130097-240KDX1ZAYFZF72DGYYR/07_LevelBP.JPG</image:loc>
      <image:title>Timelines and Triggers</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/data-types</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-04</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519582151473-Q6A30T23QOY42WNU7QOO/20_GetName.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519645669101-8UGMT858YU8KJ8JO4BBY/16a_SplitPin.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580164429-YXN3O84XH04Q44427P68/10_SetFloat.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519579044788-NGZH0APDGTJR4357VTB5/05_PrintInt.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519577506953-CU5ZG4R023V46XUMO4B4/00_DataTypes.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580089435-4W4FQ1L6IEXUSDHLQAJ9/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580316438-J8IZ8YZP60GG88LCF7T2/11_PrintVector.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519645511570-87OB9PPVVHCXXMRPFIGN/14b_SetLightColour.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519579953034-N64BMXE2T6UNLRGRY1AM/08_PrintFloat.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519579286489-6KBMR4RTKSYBVK5NGFDC/06_IntCounter.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519577857551-JQ788JARE7Q98O6UBRGT/01_MyBool.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519582813066-W646FI49OMAIMTUW05Y8/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519581009908-FIRUW4VEZY6EJIGT5O1I/15_SetWorldTransform.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580469734-3AOFGO5K06RSBWLLBRX6/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519581486534-WAXQ5637TJ2XKW47J52V/17_PrintString.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519578828765-A8WVAKMJ8DE4KY33IVRI/04_MyInt.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519582171038-U6TYELFHR085V4OOS512/21_SetActorRef.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519582804179-KFFUNEDHI50XJMUS8I15/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519579693475-7JQK4U3L7BCZILVMDWQR/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519582006302-6851NKRLAIZFN9J675NF/19_MyActor_Editable.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580641508-CUSQ23251EJPF67YVDL1/image-asset.jpeg</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519581796298-V1EJ9KKZNQ5XG6AG0GW4/18_MyActor.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519580785565-10FZYG6UJETWQ9JHZGPI/14_MakeBreakVector.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519661483613-MMAZEVPKKB35ES83D7PD/0a_Title.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519645255263-TLGZ8LVKHSZ3QL2NA2IZ/14a_PrintColour.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519578377103-SKUJTURS0SUFR526Q54J/02_PrintBool.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519578497386-SKL3F9VQM40EI1F00JPT/03_PrintBool.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519581268355-MRGQS1W72T2EKM0DKUBZ/16_BreakTransform.JPG</image:loc>
      <image:title>Data Types</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/line-traces</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-04</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519821914868-OZY133CRJLL5JDLBNOHX/04_Firestarter.JPG</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519778348877-ZUVPUY9RBLQYPOPOD7UX/03_Array.JPG</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519776551091-F9NBSGJT3S7MWTZK4GIE/image-asset.jpeg</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519821884025-TZ6AAMM5U5YWHJ30SZ2M/06_Cast.JPG</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519776443632-VK35FPTMDV98AGY5G6C5/image-asset.jpeg</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519779262207-8BJK44ZA0FB7QLB6A1RO/05_TargetBox.JPG</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519821804887-Y6J0Y6SJKABL6CZSCIFS/02_FiringTrace.JPG</image:loc>
      <image:title>Line Traces</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/tutorials</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-09-18</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/flow-control-and-functions</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-04</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676064691-L8MLAVWZ5R0I4MELURVE/00a_PlayerInput.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676213993-FWMUZWYWI4Q3U2LX0BQ3/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676321315-YXNWUK0Z9FTCS7LIIFM8/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519677148905-L1XNARNXHHP1L9LQC1ZT/09_Functions.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676237312-YXUROV8MZOSI59PEX1PF/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519677168395-7LETMN1PCY1JGLZIS9WG/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676125269-3IUQFF36VK7X8D2CZFOM/02_Branch.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676073106-SVVC53XW6U1491D9IUW6/00b_PlayerInput.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676261813-IBSW719HHFZJKT6N5GOU/06_Sequence.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676184706-Y47XO0HKDCZSJC8ME3PV/03_Delay.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519677161262-9DLGLVX4EOISFT108AB9/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676294191-GG3ACCXVPR2RW4LYDFG4/07_IsValid.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676269368-VMQ8VD1IODYOKC13R1G7/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676043629-W38D1HNF4MI4ZX232VMX/000_Title.JPG</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519676104057-CACVD4FIQBZY4YT2LQ35/image-asset.jpeg</image:loc>
      <image:title>Flow Control and Functions</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/construction-scripts</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-03-04</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519657591285-GGAEB2XDROLGEQ0REDZP/01_ContextSensitive.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519658939507-XR575H3IAWK0V9XKX80A/05_PointLightUI.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519660218225-OQPLOU0XD6L0D1BCHEVS/10_RandomSeeded.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519660089309-KHJIB9LTFRX1XTNNL2SU/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519659303501-UYVICQKB4PFG1H3P7NC6/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519659761932-UJIIZJCNQ3SDEEO5V268/08_Material_Variable.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519661033366-VGUA904X4THNF2L67LMS/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519658921710-LU54BW55UKUFUPSMC8IH/04_PointLight.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519659463826-GUL0M2S4ER16Z5K12T1F/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519658431250-T219WN5MB0KMVQ6EN6LU/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519658514810-DT3C23N5MMZV7URCI5OE/03_LocalVariables.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519660768503-JBJ0AJ2LFJF6ODIF8RZV/11_AddComponents.JPG</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1519661168038-Q6S00OVRIVYPJ2G4WDVG/image-asset.jpeg</image:loc>
      <image:title>Construction Scripts</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/unreal-tips-and-tricks</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-05-05</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524393618776-QM9LIC23AQOCHL4BSMQH/Hint_04.jpg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524394465088-XS7380VYHCI2WLBUYN06/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524393624996-2UM3ALT50HKUP8RZV9WT/Hint_05.jpg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524487216547-TXS87KM0381QI4G8L9T1/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524393312646-8B5RDKSN8K85NHF842PD/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524393325046-Z0RWB42H5KOJS4OA43ZU/Hint_03.JPG</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524394310980-FD3MMXS28CS4CFE9VKI4/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524508526625-XDYIN1D2LNWF0V62WCGR/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524393045921-SAMVQI1T4YRPUBRDIS2Q/Hints_01.jpg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1525535712410-KU8G71P0HQ4BR6H0S5YW/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1525536187920-Z3I3NTLXP6YCO76HLGY9/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1524394376268-E78KWJ1DQMXY1FZF6363/image-asset.jpeg</image:loc>
      <image:title>Unreal Tips and Tricks</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/student-work</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2019-02-02</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/reading-list</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2022-06-21</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/getting-started</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-07-05</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1530787740768-RC87MEB4C82W1O3L691P/image-asset.jpeg</image:loc>
      <image:title>Project Setup</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1530787983781-YI5Z7MM3VVXQGKV42J85/Blockout.jpg</image:loc>
      <image:title>Project Setup</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1530787471816-YM87SZA3O359H9WSZSAY/Moodboard.jpg</image:loc>
      <image:title>Project Setup</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1530789248251-BGA41WCM0Q86KNVGR1EA/image-asset.png</image:loc>
      <image:title>Project Setup</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1530788955348-2PXFJUW1DSL9BS9EYLJA/image-asset.jpeg</image:loc>
      <image:title>Project Setup</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/screenshot-tool</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2018-08-06</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/random-tile-material</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2019-01-26</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1548350664442-LK7NMRKQO2GUQZXVROO2/MaskedTilingMaterial.jpg</image:loc>
      <image:title>Random Tile Material</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/lighting-example-levels</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2020-09-08</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439389428-TQGLTE5UCKNYFIP7RZT8/SoulCity.JPG</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439021557-N2KDDRHPTZQJ61GPV5SI/Blueprints.JPG</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439203975-BET206DAC0YTVMAOBJ86/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439881092-KWT1F80GFULJV8SG5S9X/SubwayTrain.JPG</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439445068-4YSYUNY2GYR5IILCJ6UY/SoulCave.JPG</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1599577074837-GHZN6UJZFLV6C26SJ2AW/ShowdownVR.jpg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439319353-3ZAG8ZOEAZ9SMS1YLOW5/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439524861-198PHA4GK3H7HQLYRK2F/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586438846606-SSQ7732SET2DNVA372QD/ArchVis.JPG</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586438908018-DFU01NJ0JKG3M1DX3UXZ/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439106182-781EXSPOBHO189EV786U/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586439158153-87ISIKDSGF4F0Q85P50Y/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1586438970647-WS67RYV5YN52O5YZR31X/image-asset.jpeg</image:loc>
      <image:title>Lighting Example Levels</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/quiz</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2020-05-17</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728197357-V10MWXR4M1NIKLX5OIC9/MoviePoster6.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728446471-KQ43GEMIM3KP6SM6R7KI/MoviePoster1.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728245405-TKNRZRSEKWY3YVHS3JFR/MoviePoster9.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728214462-YKOBEF26K4WMOA5FUUGL/image-asset.jpeg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728459310-48D5E04J9EMHTEW6FPBB/MoviePoster2.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728158088-P5BHQQMPSKGFOV9JKD3L/MoviePoster4.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728137591-KRSL6NWB2AF2JIKW1T08/MoviePoster3.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728176086-T246QDFGIDL6YY1GXPX8/MoviePoster5.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/52b8349ae4b0af23bf050bdd/1589728227672-3CTDQRFPQ4D36J62EB2H/MoviePoster8.jpg</image:loc>
      <image:title>Quiz</image:title>
    </image:image>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/im-hiring</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2021-01-20</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/outsourcing-services</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2021-02-09</lastmod>
  </url>
  <url>
    <loc>http://www.tharlevfx.com/take-me-home</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2021-10-12</lastmod>
  </url>
</urlset>

