A Geometrical Challenge
Pyth, 40 36 34 32 bytes
-1 byte by @isaacg
JstPz_W}\+zjl#m.[J*\*-J*}\tzyd;J

A semicolon inside a lambda is now the lambda variable's global value, a feature that saves one byte.
                         Implicit: z = input
JstPz                    J = size.
_W }\+z                  Reverse if &quot;+&quot; in z
j l# m                J  Join the nonempty lines in map lambda d:... over range(J)
      .[J            ;   Pad the following with spaces (;) to length J
         *\*               &quot;*&quot;, this many times:
            -J*}\tzyd        J if &quot;t&quot; not  in z,
                             otherwise the correct number for a triangle.

Try it here.
Test suite.