Profile image

Funky Trees!

Dev WNP78  5.2 years ago

Andrew decided to call the new inputs system I cooked up "funky trees". Somehow escapes me why, but I'll roll with it. Here I'll describe what you can do in the land of funk.


Essentially what this means is that you can enter any mathematical expression (following this syntax) into an input field and it will be evaluated every frame. You can pull in data from a variety of sources, and process these how you like.

Inputs

What you can now do is use the normal input axes:

  • Pitch
  • Roll
  • Yaw
  • Throttle
  • Brake
  • Trim
  • VTOL
  • LandingGear
  • FireGuns
  • FireWeapons
  • LaunchCountermeasures
  • Activate1
  • Activate2
  • Activate3
  • Activate4
  • Activate5
  • Activate6
  • Activate7
  • Activate8

Flight data

In addition to this you can access some information from the aircraft:

  • Altitude - Aircraft's altitude in metres
  • AltitudeAgl - Aircraft's altitude above ground level in metres
  • GS - The speed relative to the ground (m/s)
  • IAS - The speed relative to the air, adjusted for the desnity of the air (m/s)
  • TAS - The speed relative to the air (m/s)
  • Fuel - The amount of fuel remaining as a proportion of capacity (0 to 1)
  • AngleOfAttack - The angle of attack (angle airflow vertically meets the boresight) in degrees
  • AngleOfSlip - The horizontal equivalent of angle of attack (degrees)
  • PitchAngle - The pitch of the aircraft (degrees)
  • RollAngle - The roll of the aircraft (degrees)
  • Heading - The heading of the aircraft (degrees)
  • Time - The time since the level loaded (seconds)
  • GForce - The acceleration and gravitational "force" acting on the cockpit in G. I know it's not a force. Shut up.
  • VerticalG - The signed vertical component of the "G Force".
  • SelectedWeaponName - The name of the selected weapon
  • Latitude - The North/South position of the craft (metres)
  • Longitude - The East/West position of the craft (metres)
  • PitchRate - The pitch angular velocity in degrees/second
  • YawRate - The yaw angular velocity in degrees/second
  • RollRate - The roll angular velocity in degrees/second (these 3 inputs are better than using rate(PitchAngle) etc, because they account for wrapping around the angle, as well as being in local space: rate(Heading) is different to YawRate)
  • TargetSelected - true if a target is selected, else false.
  • TargetHeading - the heading to the selected target in degrees.
  • TargetElevation - the vertical angle to the selected target in degrees.
  • TargetDistance - the distance to the selected target in metres.

Constants

Values that are always the same:

  • pi the mathematical constant pi (half a tau, if you will).
  • e the mathematical constant e.
  • true a true boolean value
  • false a false boolean value

Operators

These are useful for... maths or something.

  • Mathematical:

    • +, - addition and subtraction (- can be used as a unary operator, for instance -Pitch

    • *, / multiplication and division

  • Comparison:

    • <, > less than, greater than

    • <=, >= less than or equal to, greater than or equal to

    • ==, != equal to, not equal to

  • Boolean:

    • &, AND

    • |, OR

    • !, NOT (this is a unary operator)

    • Ternary operator: condition ? value_if_true : value_if_false - this chooses between two values based on the condition.

Functions

Finally, there's some helpful functions to do maths for you!

  • abs(x) - The absolute (positive) value of x.
  • ammo(name) - The amount of ammo of the weapon with name. Remember to put the name in " quotes.
  • ceil(x) - x rounded up to an integer.
  • clamp(x, min, max) - x clamped between min and max.
  • clamp01(x) - Equivalent to clamp(x, 0, 1).
  • deltaangle(a, b) - The shortest angle delta between angles a and b in degrees.
  • exp(x) - Returns e raised to the power of x.
  • floor(x) - x rounded down to an integer.
  • inverselerp(a, b, x) - Calculates the linear parameter t that produces the interpolant value within the range [a, b].
  • lerp(a, b, t) - Linearly interpolates between a and b, by a proportion of t.
  • lerpangle(a, b, t) - Similar to lerp, but interpolates correctly when values pass 360 degrees.
  • lerpunclamped(a, b, t) - Similar to lerp, but doesn't clamp the value between a and b.
  • log(x, p) - The logarithm of x in base p.
  • log10(x) - Equivalent to log(x, 10).
  • pingpong(x, l) - "Ping-pongs" the value x so it is never larger than l and never less than 0.
  • max(a, b) - The largest value between a and b.
  • min(a, b) - The smallest value between a and b.
  • pow(x, p) - x raised to the power of p.
  • repeat(x, l) - Loops the value x so it is never larger than l and never less than 0.
  • round(x) - Rounds x to the nearest integer.
  • sign(x) - The sign of x (1 if x positive, -1 if x negative)
  • smoothstep(a, b, t) - Similar to lerp, but with smoothing at the ends.
  • sqrt(x) - The square root of x.
  • sin(x) - The sine of x (degrees)
  • cos(x) - The cosine of x (degrees)
  • tan(x) - The tangent of x (degrees)
  • asin(x) - The arc-sine of x (degrees)
  • acos(x) - The arc-cosine of x (degrees)
  • atan(x) - The arc-tangent of x (degrees)
  • atan2(y, x) - The angle in degrees whose tangent is y/x. In other words the angle (argument) of a vector

Memory Functions

These are functions that are special because their output not only depends on inputs but their previous state.
- sum(x) - Returns the sum of all it's inputs over time (the integral of x)
- rate(x) - Returns the rate of change of x relative to its value last frame (the derivative of x)
- smooth(x, t) - When loaded, it's output is set to x. As x changes, the output tries to move to x, but at a rate of no greater than t. This is vaguely equivalent to changing the speed of a rotator.
- PID(target, current, p, i , d) - Evaluates a PID controller with the setpoint of "target", process variable "current" and the gains p, i, and d. Equivalent to: p * (target - current) + i * sum(target - current) - d * rate(current)

With all of these at your disposal, I'm excited to see what kind of contraptions you guys come up with, and I'm also open to some suggestions as to some things that could be added.

-WNP78, your funk master.

  • Log in to leave a comment
  • Profile image

    @griges How can I do that? I can only cycle between Roll, Pitch and Yaw.
    Edit: Made it work using XML editing now, Thanks!

    +1 2 days ago
  • Profile image
    743 griges

    @TheVizzyLucky just use +
    put the Roll+calculatedValue in each wing's control surface

    2 days ago
  • Profile image
    743 griges

    @HordTechnicians idk how to activate camera
    i dont think theres a way

    2 days ago
  • Profile image

    How exactly can I use this to control aircrafts? I'm trying to automatically control the Roll with a dynamically calculated value. These calculations work fine, but I can't get them to do anything. So, if the value is calculatedValue and the Input I want to control is Roll, what do I have to use as Variable Name and what is the Expression (my first thought, Name = Roll and Expression = calculatedValue, didn't work)? This is probably a dumb question, but I'm coming from JNO where the programming system is... different.

    3 days ago
  • Profile image

    @griges I’ve been testing with trying to add input and playing with the variables but nothing worked

    +1 3 days ago
  • Profile image
    743 griges

    @LitoMikeM1 i tried using smooth(Activate1,0.1)
    but it delays only whaen turning off ag, not turning on

    3 days ago
  • Profile image
    105 Hyandai

    I wanna make inlet that come out when engine start, thank you :)

    3 days ago
  • Profile image

    @HordTechnicians idk but maybe using a (heavily xml-edited) piston would do the job? (this probably isn't the best method but yeah)

    3 days ago
  • Profile image
    743 griges

    @HordTechnicians not that i know of
    try make new forum asking about it
    i wanna know too

    4 days ago
  • Profile image

    Is there a way to make a variable change a few seconds after an AG is activated?

    4 days ago
  • Profile image
    743 griges

    @Sumrandomdud np!

    5 days ago
  • Profile image

    Does anyone know how to make a camera automatically activate with a variable such as Activate1

    5 days ago
  • Profile image

    @griges oh alright tysm for helping us :D

    +1 6 days ago
  • Profile image
    743 griges

    @Sumrandomdud if max roll too
    wherever you put Roll controll
    example a turning wheel
    VTOL=1? 1 : 0
    The input will be 1, full turn to right

    edit;
    if you mean Roll disabled untill if VTOL at max
    just put VTOL=1 in the activation group

    6 days ago
  • Profile image

    im asking from here again, sorry
    But how do you make it so if the VTOL is at max,it enables roll?

    6 days ago
  • Profile image
    743 griges

    @Gerald19 my English is not good, but, you want activation group, but dont want to use Activate1-8?

    just use button or switch
    and change input to
    ex; i want to activate engine 1, i set switch input to eng1 and add custom variables, eng1 with value 0 or blank
    and change engine input from anything it was and add *(the switch variable you use) so originally Throttle to Throttle*eng1

    edit:
    if when turning on switch or buttons, cannot turning it off again
    edit button xml input ,interractionType set to Toggle

    17 days ago
  • Profile image
    551 Gerald19

    @griges I want to make a custom activation group so I don’t have to use the activation groups, and I want to make a custom activation group

    17 days ago
  • Profile image
    1,040 MSLITecnik

    @WNP78 can you add atan3?

    Description
    Calculate the angle between a vector and y-axis, not the x-axis as in atan2

    Usage
    atan3(x, y)
    Arguments
    x
    The x coordinate from the (x, y) locations.

    y
    The y coordinate from the (x, y) location for an organism.

    +1 17 days ago
  • Profile image
    743 griges

    @MSLITecnik methamphetamine?
    jk yeah i also kinda understand a little about theFT but the math, i need to learn more

    +1 18 days ago
  • Profile image
    1,040 MSLITecnik

    Somehow i don't understand the meth of FT

    +1 18 days ago
  • Profile image
    2,765 ACEVIPER9710

    @plenz4life If the Slats are moving up, use invert on the rotator/hinge rotator!

    clamp01(abs(AngleOfAttack/30))

    +1 22 days ago
  • Profile image

    @griges oh alright thx dude

    +1 22 days ago
  • Profile image
    743 griges

    @Gerald19 what custom input

    22 days ago
  • Profile image
    743 griges

    @Sumrandomdud if for flaps, clamping vtol down just
    clamp(VTOL,-1,0)

    22 days ago
  • Profile image
    551 Gerald19

    I’m trying to figure out how to make a custom input

    +1 22 days ago
  • Log in to see more comments