Jump to: Board index » General » Fusion

Creating muzzle flashes

Learn about 3D compositing, animation, broadcast design and VFX workflows.
  • Author
  • Message
Offline

Harold Chattaway

  • Posts: 4
  • Joined: Thu Jan 08, 2015 5:52 pm

Creating muzzle flashes

PostSat Jan 10, 2015 4:33 am

hello!
This weekend i am going to be experimenting with Fusion and using it for adding muzzle flashes. When i was doing this in Hitfilm, it had built in 3D muzzle flashes for a number of different guns. It doesn't look like those are built into Fusion... which is ok. is the Fusion way of doing this using something like the "Action Pack" from Video Copilot? This contains the muzzle flashes that are already keyed...

Any other technique that would be better?
Thanks
Harold
Offline
User avatar

Rony Soussan

  • Posts: 727
  • Joined: Tue Nov 11, 2014 5:33 pm

Re: Creating muzzle flashes

PostMon Jan 12, 2015 7:16 pm

Are you looking at making a 3D muzzle flash via 2D textures or do you want a particle system type setup?
Offline
User avatar

michael vorberg

  • Posts: 943
  • Joined: Wed Nov 12, 2014 8:47 pm
  • Location: stuttgart, germany

Re: Creating muzzle flashes

PostMon Jan 12, 2015 7:37 pm

for 2D solution: you could use videofootage (like the action pack from videocopilot) or because muzzle flashes are just 1-2 frames: make a shape and use it as muzzle flash or look for photoshop brushes

when your happy with your work you can copy that nodes into your bin and then you have a collection of own mmuzzle flashes for the future
Offline

Harold Chattaway

  • Posts: 4
  • Joined: Thu Jan 08, 2015 5:52 pm

Re: Creating muzzle flashes

PostTue Jan 13, 2015 3:06 am

ok, I had seen the video co-pilot resources... great stuff..

I had been creating the muzzle flashes before in Hitfilm and they have a large collection of them for different types of guns... they can be oriented in 3d what ever way is needed...

But Ive been enjoying using Fusion and I'll try the co-pilot approach.. I know that's how its' done! :)

Thanks
Harold
Offline

Ivan Ivanov

  • Posts: 86
  • Joined: Tue Nov 11, 2014 11:16 am

Re: Creating muzzle flashes

PostTue Jan 13, 2015 10:18 pm

Offline
User avatar

Eric Westphal

  • Posts: 214
  • Joined: Thu Nov 20, 2014 1:59 pm

Re: Creating muzzle flashes

PostWed Jan 14, 2015 7:42 am

I just realized that the Comp on Pigsfly had a little issue,
which made it not looking like a MuzzleFlash at all...:-)

Here's an updated version.

Code: Select all
{
   Tools = ordered() {
      CreateBumpMap1 = CreateBumpMap {
         Inputs = {
            Input = Input {
               SourceOp = "FastNoise1",
               Source = "Output",
            },
            HeightScale = Input { Value = 100, },
            BumpmapTextureDepth = Input { Value = 4, },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -544.5, }, },
      },
      Background1 = Background {
         CustomData = {
            Settings = {
               [1] = {
                  Tools = ordered() {
                     Background1 = Background {
                        Inputs = {
                           Height = Input { Value = 720, },
                           Gradient = Input {
                              Value = Gradient {
                                 Colors = {
                                    [0] = { 0, 0, 0, 1, },
                                    [1] = { 1, 1, 1, 1, },
                                 },
                              },
                           },
                           TopLeftAlpha = Input { Value = 0, },
                           Width = Input { Value = 1280, },
                        },
                        Name = "Background1",
                        CtrlWZoom = false,
                        ViewInfo = OperatorInfo { Pos = { 259, 256, }, },
                        CustomData = {
                        },
                     },
                  },
               },
               [2] = {
                  Tools = ordered() {
                     Background1 = Background {
                        Inputs = {
                           TopLeftRed = Input { Value = 1, },
                           TopLeftGreen = Input { Value = 0.760784387588501, },
                           Height = Input { Value = 720, },
                           Gradient = Input {
                              Value = Gradient {
                                 Colors = {
                                    [0] = { 0, 0, 0, 1, },
                                    [1] = { 1, 1, 1, 1, },
                                 },
                              },
                           },
                           TopLeftBlue = Input { Value = 0.0588235333561897, },
                           Width = Input { Value = 1280, },
                        },
                        CtrlWZoom = false,
                        ViewInfo = OperatorInfo { Pos = { 259, 256, }, },
                        CustomData = {
                        },
                     },
                  },
               },
            },
         },
         Inputs = {
            Width = Input { Value = 256, },
            Height = Input { Value = 256, },
            TopLeftRed = Input { Value = 0.246666666666667, },
            TopLeftGreen = Input { Value = 0.246666666666667, },
            TopLeftBlue = Input { Value = 0.246666666666667, },
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0, 0, 0, 1, },
                     [1] = { 1, 1, 1, 1, },
                  },
               },
            },
            EffectMask = Input {
               SourceOp = "Ellipse1",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -385, -445.5, }, },
      },
      NumberFlares = Fuse.Duplicate {
         NameSet = true,
         Inputs = {
            Copies = Input { Value = 4, },
            Angle = Input {
               Value = 90,
               Expression = "360/Copies",
            },
            RandomSeed = Input { Value = 26024, },
            Background = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
            Comments = Input { Value = "How many flares should be there?", },
         },
         ViewInfo = OperatorInfo { Pos = { -275, -445.5, }, },
      },
      Ellipse1 = EllipseMask {
         Inputs = {
            MaskWidth = Input { Value = 1280, },
            MaskHeight = Input { Value = 720, },
            PixelAspect = Input { Value = { 1, 1, }, },
            ClippingMode = Input { Value = FuID { "None", }, },
            Center = Input {
               SourceOp = "XYPath1",
               Source = "Value",
            },
            Width = Input {
               Value = 0.0144032921810706,
               Expression = "0.5/Center.Y-0.5",
            },
            Height = Input {
               Value = 0.0144032921810706,
               Expression = "Width",
            },
            Comments = Input { Value = "The Y-Animation Spline controls the shape of the side-flares", },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -445.5, }, },
      },
      XYPath1 = XYPath {
         ShowKeyPoints = false,
         DrawMode = "ModifyOnly",
         Inputs = {
            X = Input {
               SourceOp = "XYPath1X",
               Source = "Value",
            },
            Y = Input {
               SourceOp = "XYPath1Y",
               Source = "Value",
            },
         },
      },
      XYPath1X = BezierSpline {
         SplineColor = { Red = 255, Green = 0, Blue = 0, },
         NameSet = true,
         KeyFrames = {
            [0] = { 0.5, RH = { 8.33333333333333, 0.5, }, Flags = { Linear = true, }, },
            [25] = { 0.5, LH = { 16.6666666666667, 0.5, }, Flags = { Linear = true, }, },
         },
      },
      XYPath1Y = BezierSpline {
         SplineColor = { Red = 0, Green = 255, Blue = 0, },
         NameSet = true,
         KeyFrames = {
            [0] = { 0.916, RH = { 2.33333333333333, 0.877333333333333, }, Flags = { Linear = true, }, },
            [7] = { 0.8, LH = { 4.66666666666667, 0.838666666666667, }, RH = { 13, 0.857333333333333, }, Flags = { Linear = true, }, },
            [25] = { 0.971999999999999, LH = { 19, 0.914666666666666, }, Flags = { Linear = true, }, },
         },
      },
      BrightnessContrast5 = BrightnessContrast {
         Inputs = {
            ApplyMaskInverted = Input { Value = 1, },
            Alpha = Input { Value = 1, },
            Contrast = Input { Value = 10.8333333, },
            Input = Input {
               SourceOp = "CreateBumpMap1",
               Source = "Output",
            },
            EffectMask = Input {
               SourceOp = "Bitmap1",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -110, -544.5, }, },
      },
      FastNoise1 = FastNoise {
         Inputs = {
            Width = Input { Value = 256, },
            Height = Input { Value = 256, },
            Depth = Input { Value = 4, },
            Discontinuous = Input { Value = 1, },
            XScale = Input { Value = 2.513089, },
            SeetheRate = Input { Value = 1, },
            Type = Input { Value = 1, },
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0.966666666666667, 0.451656502695806, 0, 1, },
                     [1] = { 1, 0.867865291029152, 0.386844444444444, 1, },
                  },
               },
            },
            Comments = Input { Value = "Controls the overall Colors of the Blast", },
         },
         ViewInfo = OperatorInfo { Pos = { -715, -412.5, }, },
      },
      Bitmap1 = BitmapMask {
         Inputs = {
            MaskWidth = Input { Value = 1280, },
            MaskHeight = Input { Value = 720, },
            PixelAspect = Input { Value = { 1, 1, }, },
            ClippingMode = Input { Value = FuID { "None", }, },
            Image = Input {
               SourceOp = "NumberFlares",
               Source = "Output",
            },
            Comments = Input { Value = "Level controls the overall strength of the flares", },
            EffectMask = Input {
               SourceOp = "Center",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -275, -379.5, }, },
      },
      Center = EllipseMask {
         NameSet = true,
         Inputs = {
            Level = Input { Value = 0.460733, },
            PaintMode = Input { Value = FuID { "Add", }, },
            MaskWidth = Input { Value = 1280, },
            MaskHeight = Input { Value = 720, },
            PixelAspect = Input { Value = { 1, 1, }, },
            ClippingMode = Input { Value = FuID { "None", }, },
            Width = Input {
               SourceOp = "GradientColorModifier2",
               Source = "Color1",
            },
            Height = Input {
               Value = 0,
               Expression = "Width",
            },
            Comments = Input { Value = "Level controls intensity of CenterBlast.\r\nThe Gradient on Width controls shape of CenterBlast.\r\nTimeSettings on Gradient control length of Blast.", },
            EffectMask = Input {
               SourceOp = "Main",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -385, -379.5, }, },
      },
      GradientColorModifier2 = GradientColorModifier {
         CtrlWZoom = false,
         Inputs = {
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0, 0, 0, 1, },
                     [0.803921568627451] = { 0.253333333333333, 0.253333333333333, 0.253333333333333, 1, },
                     [1] = { 0, 0, 0, 1, },
                  },
               },
            },
            TimeNest = Input { Value = 1, },
            EndTime = Input { Value = 60, },
         },
      },
      Main = EllipseMask {
         NameSet = true,
         Inputs = {
            Level = Input { Value = 0.2879581, },
            MaskWidth = Input { Value = 1280, },
            MaskHeight = Input { Value = 720, },
            PixelAspect = Input { Value = { 1, 1, }, },
            ClippingMode = Input { Value = FuID { "None", }, },
            Width = Input {
               SourceOp = "GradientColorModifier1",
               Source = "Color1",
            },
            Height = Input {
               Value = 0.4,
               Expression = "Width",
            },
            Comments = Input { Value = "Level controls intensity of MainBlast.\r\nThe Gradient on Width controls shape of MainBlast.\r\nTimeSettings on Gradient control length of Blast.", },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -379.5, }, },
      },
      GradientColorModifier1 = GradientColorModifier {
         CtrlWZoom = false,
         Inputs = {
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0, 0, 0, 1, },
                     [0.36078431372549] = { 0.573333333333333, 0.573333333333333, 0.573333333333333, 1, },
                     [0.490196078431373] = { 0.66, 0.66, 0.66, 1, },
                     [0.588235294117647] = { 0.4, 0.4, 0.4, 1, },
                  },
               },
            },
            TimeNest = Input { Value = 1, },
            EndTime = Input { Value = 60, },
         },
      },
      BrightnessContrast2 = BrightnessContrast {
         Inputs = {
            Brightness = Input { Value = -0.5, },
            Input = Input {
               SourceOp = "BrightnessContrast5",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 220, -544.5, }, },
      },
      Displace1 = Displace {
         Inputs = {
            Type = Input { Value = 1, },
            XRefraction = Input { Value = 0.0635417, },
            YRefraction = Input { Value = 0.02, },
            Input = Input {
               SourceOp = "Transform1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "BrightnessContrast2",
               Source = "Output",
            },
            Comments = Input { Value = "X and Y Refraction controls irregularity of Blast", },
         },
         ViewInfo = OperatorInfo { Pos = { 220.844, -314.344, }, },
      },
      Transform1 = Transform {
         Inputs = {
            Size = Input { Value = 0.5578947, },
            Input = Input {
               SourceOp = "BrightnessContrast4",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 55, -313.5, }, },
      },
      BrightnessContrast4 = BrightnessContrast {
         Inputs = {
            Gain = Input { Value = 2.875, },
            Input = Input {
               SourceOp = "BrightnessContrast3",
               Source = "Output",
            },
            EffectMask = Input {
               SourceOp = "Bitmap1",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -55, -313.5, }, },
      },
      BrightnessContrast3 = BrightnessContrast {
         Inputs = {
            ApplyMaskInverted = Input { Value = 1, },
            Alpha = Input { Value = 1, },
            Gain = Input { Value = 0, },
            Input = Input {
               SourceOp = "Merge1",
               Source = "Output",
            },
            EffectMask = Input {
               SourceOp = "Bitmap1",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -165, -313.5, }, },
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "FastNoise1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "pRender1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -313.5, }, },
      },
      pRender1 = pRender {
         Inputs = {
            ["_MotionBlurWarning"] = Input { Disabled = true, },
            Width = Input { Value = 256, },
            Height = Input { Value = 256, },
            OutputMode = Input {
               Value = FuID { "TwoD", },
               Disabled = true,
            },
            IntegrationMethod = Input { Value = FuID { "RK4", }, },
            ["MaterialID.MaterialID"] = Input { Value = 1, },
            ["ObjectID.ObjectID"] = Input { Value = 1, },
            Input = Input {
               SourceOp = "pEmitter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -280.5, }, },
      },
      pEmitter1 = pEmitter {
         ID = 29,
         Inputs = {
            Number = Input { Value = 93.7172775, },
            Lifespan = Input { Value = 1, },
            Style = Input { Value = FuID { "ParticleStyleBlob", }, },
            Region = Input { Value = FuID { "AllRgn", }, },
            ["ParticleStyle.ColorOverLife"] = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 1, 1, 1, 1, },
                  },
               },
            },
            ["ParticleStyle.SizeControls"] = Input { Value = 1, },
            ["ParticleStyle.Size"] = Input { Value = 1, },
            ["ParticleStyle.SizeOverLife"] = Input {
               SourceOp = "pEmitter1SizeoverLife",
               Source = "Value",
            },
            ["ParticleStyle.BlurOverLife"] = Input {
               SourceOp = "pEmitter1BluroverLife2D",
               Source = "Value",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -495, -247.5, }, },
      },
      pEmitter1SizeoverLife = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0.5, RH = { 0.333333333333333, 0.5, }, Flags = { Linear = true, }, },
               [1] = { 0.5, LH = { 0.666666666666667, 0.5, }, Flags = { Linear = true, }, },
            },
         },
         SplineColor = { Red = 192, Green = 128, Blue = 64, },
      },
      pEmitter1BluroverLife2D = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0.5, RH = { 0.333333333333333, 0.5, }, Flags = { Linear = true, }, },
               [1] = { 0.5, LH = { 0.666666666666667, 0.5, }, Flags = { Linear = true, }, },
            },
         },
         SplineColor = { Red = 192, Green = 128, Blue = 64, },
      },
      FastNoise2 = FastNoise {
         Inputs = {
            Width = Input { Value = 1280, },
            Height = Input { Value = 720, },
            Depth = Input { Value = 3, },
            XScale = Input { Value = 9.5287958, },
            SeetheRate = Input { Value = 1, },
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0, 0, 0, 1, },
                     [1] = { 1, 1, 1, 1, },
                  },
               },
            },
            Comments = Input { Value = "This Fastnoise is full of eels", },
         },
         ViewInfo = OperatorInfo { Pos = { 605, -280.5, }, },
      },
      Renderer3D1 = Renderer3D {
         Inputs = {
            Width = Input { Value = 1280, },
            Height = Input { Value = 720, },
            Depth = Input { Value = 3, },
            SceneInput = Input {
               SourceOp = "Merge3D1",
               Source = "Output",
            },
            RendererType = Input { Value = FuID { "RendererOpenGL", }, },
            ["RendererOpenGL.Channels.Nest"] = Input { Value = 1, },
            ["RendererOpenGL.Channels.WorldCoord"] = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { 332.395, -148.784, }, },
      },
      VolumeFog1 = VolumeFog {
         CtrlWZoom = false,
         Inputs = {
            Shape = Input { Value = FuID { "Sphere", }, },
            Rotation = Input { Value = 1, },
            ["Rotate.RotOrder"] = Input { Value = FuID { "XYZ", }, },
            ["Rotate.Y"] = Input { Value = 90, },
            ScaleLock = Input { Value = 1, },
            Size = Input { Value = 3, },
            Samples = Input { Value = 60, },
            ZSlices = Input { Value = 60, },
            Gain = Input { Value = 4.9583333, },
            Image = Input {
               SourceOp = "Renderer3D1",
               Source = "Output",
            },
            FogImage = Input {
               SourceOp = "Displace1",
               Source = "Output",
            },
            SceneInput = Input {
               SourceOp = "Camera3D1",
               Source = "Output",
            },
            Comments = Input { Value = "Use Y-Rotation to rotate the Blast", },
         },
         ViewInfo = OperatorInfo { Pos = { 550.844, -149.483, }, },
      },
      Merge2 = Merge {
         Inputs = {
            Blend = Input { Value = 0.0418848, },
            Background = Input {
               SourceOp = "FastNoise2",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "VolumeFog1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 715, -280.5, }, },
      },
      Merge3D1 = Merge3D {
         Inputs = {
            SceneInput2 = Input {
               SourceOp = "Camera3D1",
               Source = "Output",
            },
            SceneInput3 = Input {
               SourceOp = "World",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 110, -148.5, }, },
      },
      World = Shape3D {
         NameSet = true,
         Inputs = {
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 4, },
            Shape = Input { Value = FuID { "SurfaceSphereInputs", }, },
            ["MtlStdInputs.Diffuse.Color.Red"] = Input { Value = 0, },
            ["MtlStdInputs.Diffuse.Color.Green"] = Input { Value = 0, },
            ["MtlStdInputs.Diffuse.Color.Blue"] = Input { Value = 0, },
            ["MtlStdInputs.Diffuse.Opacity"] = Input { Value = 0, },
            ["MtlStdInputs.ReceivesLighting"] = Input { Value = 0, },
            ["MtlStdInputs.ReceivesShadows"] = Input { Value = 0, },
            ["MtlStdInputs.UseTwoSidedLighting"] = Input { Value = 1, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
            ["SurfaceSphereInputs.Radius"] = Input { Value = 10, },
            ["SurfaceSphereInputs.Visibility.Nest"] = Input { Value = 1, },
            ["SurfaceSphereInputs.Visibility.IgnoreTransparentPixelsInAuxChannels"] = Input { Value = 0, },
            ["SurfaceSphereInputs.Matte.Nest"] = Input { Value = 1, },
            ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 5, },
         },
         ViewInfo = OperatorInfo { Pos = { -17.3628, -149.414, }, },
      },
      CreateBumpMap2 = CreateBumpMap {
         Inputs = {
            Input = Input {
               SourceOp = "Merge2",
               Source = "Output",
            },
            HeightScale = Input { Value = 57.0681058, },
         },
         ViewInfo = OperatorInfo { Pos = { 825, -280.5, }, },
      },
      Camera3D1 = Camera3D {
         Inputs = {
            ["Transform3DOp.Translate.Z"] = Input { Value = 8.0518679, },
            FLength = Input { Value = 18.2123442718302, },
            ["Stereo.Mode"] = Input { Value = FuID { "OffAxis", }, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 3, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 2, },
         },
         ViewInfo = OperatorInfo { Pos = { -32.3777, -82.5, }, },
      },
      BrightnessContrast6 = BrightnessContrast {
         Inputs = {
            Brightness = Input { Value = -0.5, },
            Input = Input {
               SourceOp = "CreateBumpMap2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 935, -280.5, }, },
      },
      Displace2 = Displace {
         Inputs = {
            Type = Input { Value = 1, },
            XRefraction = Input { Value = 0.1, },
            YRefraction = Input { Value = 0.1, },
            Input = Input {
               SourceOp = "VolumeFog1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "BrightnessContrast6",
               Source = "Output",
            },
            Comments = Input { Value = "Some more Displacement", },
         },
         ViewInfo = OperatorInfo { Pos = { 936.551, -149.344, }, },
      },
      BrightnessContrast1 = BrightnessContrast {
         Inputs = {
            Alpha = Input { Value = 1, },
            Gain = Input {
               SourceOp = "BrightnessContrast1Gain",
               Source = "Value",
            },
            Input = Input {
               SourceOp = "Displace2",
               Source = "Output",
            },
            Comments = Input { Value = "On-Off-On-Off....well...you know...;-)", },
         },
         ViewInfo = OperatorInfo { Pos = { 1084.33, -151.522, }, },
      },
      BrightnessContrast1Gain = BezierSpline {
         SplineColor = { Red = 104, Green = 144, Blue = 233, },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, Loop = true, }, },
            [1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, RH = { 1.33333333333333, 0.666666666666667, }, Flags = { Linear = true, }, },
            [2] = { 0, LH = { 1.66666666666667, 0.333333333333333, }, RH = { 2.66666666666667, 0, }, Flags = { Linear = true, }, },
            [4] = { 0, LH = { 3.33333333333333, 0, }, Flags = { Linear = true, Loop = true, }, },
         },
      },
   },
}
my hovercraft is full of eels.

Return to Fusion

Who is online

Users browsing this forum: No registered users and 22 guests