Source Filmmaker Wiki

In Progress Discoveries

19pages on
this wiki
Add New Page
Talk0 Share

Working out how to use Source Filmmaker takes time and involves plenty of small discoveries. Even if a use for these discoveries is not immediately obvious, it could come in handy later.


  • SFM disables sv_cheats each map load. If it is not re-enabled, the rendering dialogue can experience errors (such as a negative percentage) and produce invalid video files

Dme Element EditorEdit

  • You can shift the position of individual takes - eg. if you wanted a scout to get blown up by a rocket but mis-timed it, you don't necessarily have to re-record it
    • Browse to "clipBin/sequence/subClipTrackGroup/tracks/Film/children/shot/scene/children/take*/transform", where take* is the relevant take. You can then edit the position to shift the recording
    • Note that this affects everything in that take, including world objects like medpacks and doors. If you want to affect individual takes, expand take*/children, find the relevant model(s), then adjust their transform/position
  • Some of the editor's settings are stored in the Dme Element Editor - this includes things like the position of the handles in the animation set editor and even the colour overlay when you start using the animation set editor

Interpolation MethodsEdit

  • The Dme Element Editor allows access to a feature that is not available in the GUI (as far as I can tell) - the interpolation method the Animation Set Editor uses. Usually it applies a linear interpolation within the handle's falloff area when using the sliders. However, there are other options available:
    • Note: Invalid options seem to default to Ease
    • Note: Sometimes it refuses to change the interpolation method. Select another field and then try again
    • Note: Directions (start and end) are written relative to the left interpolator. That is, "start" is farthest away from handle, "end" is closest
    • 0 - Steeper Ease (not sure the "real" name of this one)
    • 1 - Variation on Ease
    • 2 - Ease In (changes fastest at start, slowest at end)
    • 3 - Ease Out (changes slowest at start, fastest at end)
    • 4 - Ease (changes faster in the middle than at either end)
    • 5 - Linear with offset (jerks slightly at start and end?)
    • 6 - Linear (default)
    • 7 - Several of these are slight variations on the Ease method
    • 13 - Polynomial (basically, it creates a "bump" of the max value in between the start and end of the falloff area. Looks pretty glitchy, not to mention it causes overlap on the GUI)
    • 14 - Much more dramatic Ease Out
    • 15 - No interpolation
    • 16 - Ease variation. This seems to be the last valid option
  • To use any of these, just enter the valid number in settings/timeSelection/interpolator_left or settings/timeSelection/interpolator_right. While you're at it, you can also control the exact position and falloff size of the handles (times are in 10s of milliseconds. 10000 is 1 second)

Expression field commandsEdit

  • This is a list of known commands for expression fields, along with their arguments
  • Note that if you enter an invalid expression, it evaluates up to the point of error. For example, the expression "1+sign(-)+4" equals 1, as it stopped evaluating when it encountered the missing argument
  • Similarily, you must close all brackets correctly
    • General Number-Work:
      • round( val ) - Rounds to the nearest whole number ((val-val%1>=0.5) ? val%1+1 : val%1)
      • ceiling( val ) - Rounds up
      • floor( val ) - Rounds down
      • sqrt( val ) - Returns the square root of the number
      • sqr( val ) - Squares the number (val*val)
      • abs( val ) - Absolute function. Makes the number positive ((val>0) ? val : -val)
      • pow( val, power ) - Raises val to a power
      • exp( power ) - Raises e to a power
    • Trigonometry:
      • rtod( val ) - Converts value from radians to degrees
      • dtor( val ) - Converts value from degrees to radians
      • sin, cos, tan( val ) - They all do what they say on the tin. Value must be in radians
      • asin, acos( val ) - Take arcsine / arccosine of value
      • atan2( y, x ) - Returns angle (in radians) from positive x axis to vector (x, y)
    • Logic:
      • Note: Unless otherwise stated, logic functions return 1 or 0 (true or false)
      • sign( val ) - Returns the sign of the number (1 or -1). 0 is considered positive ((val>=0) ? 1 : -1)
      • max( val, val2 ) - Returns the larger of the two numbers ((val>val2) ? val : val2)
      • min( val, val2 ) - Returns the smaller of the two numbers
      • inrange( val, lo, hi ) - Returns 1 if value is larger than/equal to lo and smaller than/equal to hi. Note that lo should be smaller than hi (val<hi && val>lo)
    • Scaling:
      • lerp( val, lo, hi ) - Linearly interpolates a value from 0-1 to lo-hi. Note that it accepts any value, so -1 will return -hi (lo+val*(hi-lo))
      • clerp( val, lo, hi ) - Clamps val from 0-1 before linearly interpolating (lerp(clamp(val,0,1),lo,hi))
      • ramp( val, lo, hi ) - Returns the "position" between lo and hi that val is, scaled to 0-1. Note that if val is not within the range you may get #INF as a result ((val-lo)/(hi-lo))
      • cramp( val, lo, hi ) - Clamps val from lo-hi before determining its "position" using ramp (ramp(clamp(val,lo,hi),lo,hi))
      • clamp (val, lo, hi) - Clamps the value to the range lo-hi. Note that lo should be smaller than hi ((val>hi) ? hi : ((val<min) ? min : val))
      • rescale( val, lo, hi, newlo, newhi ) - Scales a value from one range to another. Note that order is very important ((val-lo)/(hi-lo)*(newhi-newlo)+newlo)
      • crescale( val, lo, hi, newlo, newhi ) - Clamps the value before rescaling it (rescale(clamp(val,lo,hi),lo,hi,newlo,newhi))
    • Unknown:
      • elerp( val, lo, hi ) - I'd expect this to be exponential interpolation, but I've seen no difference from lerp within val range 0-1 and it's gone weird outside of that. lo and hi cannot be 0 (lo*pow(hi/lo,val))
    • Not Tested:
      • noise
      • modf
      • ceil
      • atan
      • exp10
      • log10

Ad blocker interference detected!

Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.