DAM Version 3.0 is released!

I can honestly say writing DAM gives me great joy. And there is no related joy bigger than announcing a new major release! So here come the goose bumps…

Announcing the release of DAM 3.0!

Here are a few pics of some action from fields and models that are included with version 3.0.

Digital Aircraft Modeler Version 3.0 Pic 6
X-Wing Fighter at BattleField Maze 1 V3

Digital Aircraft Modeler Version 3.0 Pic 5
Beechcraft Sierra at Farm Field V3

Digital Aircraft Modeler Version 3.0 Pic 4
DH2 with Weapons Heavy at BattleField Castle V3

Digital Aircraft Modeler Version 3.0 Pic 3
DH2 with Weapons Heavy at BattleField Castle V3

Digital Aircraft Modeler Version 3.0 Pic 2
F14 Tomcat at BattleField 1 V3

Digital Aircraft Modeler Pic
F14 Tomcat at BattleField 1 V3

Fog and Ocean

You’ll find several major new features in DAM Version 3.0, including depth based Fog, and an ocean to surround your flying fields. The visuals have never been sweeter.

Night and Day

You will also find two new procedural sky levels, sun and moon. Using them you can choose an image to represent them in the flying field, along with the size and speed of their movement. When you choose to use them, the global lights move along with them. Shadows grow and shrink as the sun moves. And when the sun goes below the horizon, night falls. It is definitely fun to battle the enemy at night.

Enemy with Attitude

While working, I also gave the air based enemy (air autonomous objects) a little artificial intelligence. They now know where your aircraft is, and periodically turn aggressive! Their behavior is often unexpected, and will put a smile on your face. As I was developing the logic for the AO’s I realized this is the future of air warfare. It’s so obvious. An unmanned aircraft can perform maneuvers with a G-force far greater than a pilot can stand. This simple fact means the drones of the future are destined to fly combat. As I wrote the code, I realized I could transfer it to reality with only a modest amount of work. If i can do it in my office, you know the big boys are already working on it. Gives you pause, doesn’t it? Especially if you’re a combat pilot!

Perhaps the best news of all, DAM Version 3.0 will work with your DAM 2.0 license. Just uninstall your version 2.x, download the new version and install it. The new version will find your old key.

I’ll write a blog article about each of the new features in DAM Version 3.0 over the next few weeks. As the articles are published, I’ll send an email to those of you who have asked to be kept informed. If you haven’t asked, please do so on the keep informed web page.

Download DAM Version 3.0 today from the download page on the website.

Good Digital Modeling!
Sunday Flyer Software.

Posted in General Info | Leave a comment

F14 Tomcat Jolly Roger

The recent update (Version 2.3) allows the proper use of the auxiliary slider. Its availability just SCREAMS for a variable sweep wing aircraft. What better than one of the most fearsome jets of all time, the Jolly Rogers’ F14 Tomcat.

These Navy jets inspired terror in the enemy from late 1977 through 1995. The dramatic angled twin tail and swept wings give this fighter the terrifying look of a descending hawk about to snatch its prey.

The fuselage was more challenging to draw than any aircraft I’ve worked on to date. It features dramatically curved surfaces blending a central body to the twin engines, that have nearly as much volume each as the main body. The result is a compound lifting surface that is simply gorgeous.

I found it easiest to attack the shape as a D shaped central fuselage with an attached engine. These were then mirrored into the full compound shape. When it came time to texture them, I decided the best effect would be to texture the front part of the fuselage with a side projected texture, and the engine and rear part of the fuselage with a top projected texture. Because of this, the final drawing has the fuselage represented by two separate objects. If anyone would like the working files with sketches included, just let me know.

The stabilizer is full flying, just like the real bird. I’ve also added a mix of aileron rotation to the stabs. I’m not sure the real aircraft used these, but it was just too hard to resist. It is a joy to watch the dual control moving these large control surfaces.

There are also Glove Vanes in the drawing. These are “supersonic stabilizers” that look like a pair of small wings that extend and retract just fore of the main wings. The reading I did says they are retracted at subsonic speeds and extend automatically at supersonic speeds, however some of the video I saw showed them extended during low speed maneuvers. I chose to retract them along with the wing sweep, letting them extend when the wings are not swept, simply because they look so cool that way on approach. Note that the reading I did said the F-14A was the only version with glove vanes.

You can find some inspiring video of the Jolly Rogers’ Tomcats and the USS Nimitz in the science fiction movie “The Final Countdown”. If you search for “The Final Countdown F14″ on YouTube, you can find really great clips of the flight scenes.

I chose to draw an AIM-54 Phoenix missile to hang from the aircraft. This was a long range air to air and was effective up to 100 miles away. This long range capability is reflected in the drawn missile’s capability. You can hit the enemy when it is quite far away.

The drawing includes only one other weapon. There is a flaring on the left side of the front fuselage that contains a gun control object imitating the M61-A1 Cannon. This cannon on the real jet can fire about 6000 round a minute, but only carries 676 rounds! The gun on the drawing is a bit unrealistic, but quite useful. It is set to fire 60 rounds a minute and can fire a ridiculous 20000 rounds before going empty.

The color scheme we chose is a bit unusual. Normally you see this scheme with yellow highlights. If you study the resources on the web, you will find the white highlight scheme. There are lots of good websites with information about the F14. One I found particularly helpful is here.

The new aircraft is ready to download on the user page. It is designed for version 2.x only, and the new “flame” option is set, so the jet exhaust looks especially real in version 2.3 and above. Download yours today and enjoy.

Good Digital Modeling!
Sunday Flyer Software

Posted in General Info | Leave a comment

Battlefield Maze – A Height Map Example

The height maps as introduced in version 2.2 allow us to change the topography based on the luminance values in a bitmap. The principle is simplicity itself. The color in our texture image (picture) is defined by 3 color components, Red, Green and Blue. Each of these components can have a value from 0 (none) to 255 (max). Some images also have additional components but we are only concerned with the color.

The height map feature lines up the picture with the terrain polygons as if you are looking straight down from directly above the landscape. It finds the pixels that correspond with each point in the triangles that make up the terrain. It looks at the color in this pixel, and adds up the color components. This value is then divided by 765 (the maximum value possible, 255+255+255). This results in a range from 0.0 to 1.0 based on the “luminance” of the pixel.
When you define the terrain you enter a “height”. This value is multiplied by the luminance value in the height map to get the adjusted height of the terrain at each point. So if the pixel is black (0,0,0) the height is multiplied by (0+0+0)/765 = 0.0, or no height. If the pixel is a perfect red, the height is multiplied by (255+0+0)/765 = 0.3333 of the max height. If the pixel is perfect white (255,255,255) the height is multiplied by (255+255+255)/765 = 1.0 of the max height.

For the Battlefield Maze example, we created an image of a maze type of puzzle in a paint program. This image has only 2 colors, black and white. We created a rectangular terrain and used the image to control the height of the points in the triangles that make up the terrain. The result makes for an interesting field to fly in.

You can modify the terrain in several ways to gain experience in using height maps. After loading the field, right click on the terrain object and select “Terrain Edit”. Notice that “Circular” is turned off, so we will make a rectangular terrain. The length and width are set for 7200. The “F” is selected, so this is feet, or 1.36 miles on each side. The “Height” is set to 500 feet. “Noise” and “Local Z Flat” are set to 0.0, so they will remain constant (they still have an effect, even when at 0.0, but it does not vary based on the point’s position).

These are self evident in their impact, but two of the other variables and features, “Valleys <=> Peaks” and “Midridge” require a little play to understand enough to use.

“Valleys <=> Peaks” is set to 1.0. This is a second modifier that allows you to move the positive values of the terrain up and down from the origin. Values that are black (0 height) will not be affected. You can change the value, then click “Make/Modify” to see the effect. You can explore this by trying various values. Change it to -1.0. Notice that the high parts are now depressed. Does this make sense to you? To use the feature for your own terrains, just try values until you get the result you are after.

“Midridge” is off in this terrain. If you turn it on and click “Make/Modify” you’ll see what this feature does. Try it with the “Smooth” and the “Sharp” option on, and again with neither of these on. Midridge works in combination with, and has a similar affect to the “Local Z Flat” option, except “Local Z Flat” only modifies the center of the terrain, while “Midridge” modifies both the center and the outer edge of the terrain.

Notice that the terrain has X and Y Divisions of 36. This tells the terrain tool how much resolution to use for the terrain. In this case the terrain will have 36*36*2 = 2592 triangles. You can use a higher or lower resolution if you like, but make sure you have a graphics card that is powerful enough to render the terrain in real time during the flying routines. NOTICE that if you change the resolution, the terrain tool will delete the current terrain and create a new one. This means you will lose the current texture mapping. If you do this you will have to reapply the texture map after you finish making your new terrain. Don’t be afraid to try it. If you don’t like your changes, you can always close the file without saving it, then reload the original file. (To reapply the texture map, right click on the new terrain object and select “Surface Properties”. Go to the “Texture” tab. Scroll to the texture you want to use and select it. Now click the “Projection” button. Select “Projection” then “Z Projection”. The texture will be applied in exactly the same position as is used for the height map.)

I hope the Height Map feature as well as the terrain tool in general is now a little clearer to use.

You can download the Battlefield Maze flying field now at this download page.

Good Digital Modeling
Sunday Flyer Software

Posted in General Info | Leave a comment

New Release – DAM 2.3

We just published a new release to the website. DAM 2.3 is a minor release with a few fixes and additions.

Flame Direction

Some of the jet aircraft use smoke settings that make the smoke particles appear to be flames. The “flame” particles move as if they are smoke. We added a new option in the smoke properties window.

If you turn this on, the “flame” particles will appear lined up with the long axis of the aircraft, the typical behavior of a jet exhaust.

Muzzle Flash

You specify the image you want for a muzzle flash when a gun fires. You also specify how long it is visible along with how it changes over time. However, the position of the muzzle flash image was not tracking properly with the gun when the gun was part of the aircraft. This has been fixed. While we were in these functions, we added a routine that makes sure the muzzle flash image is visible for at least one frame, even if you specify a time that expires before the first frame is shown. This means you will always see the muzzle flash image at least once.

Bomb and Missile Alignment

You may have noticed that the missiles and bombs align with their direction of travel. You may have also noticed that if the aircraft is standing still on the ground when these weapons are released, they immediately align with the direction as intended. However, the direction at the immediate time of release is straight down. this looks very unnatural. We have added a time delay to the alignment functions for a much more natural alignment behavior.

Wheel Rotation

We are just finishing a new F-14 Tomcat. The aircraft has tricycle gear. The nose wheel is smaller than the main wheels. When taxiing, it should rotate faster than the main wheels. The rotation control is in the wheel control object, and can be specified (as a diameter) for each wheel. However, there was a global variable that only used the first wheel found in the aircraft for this diameter. This has been fixed. Each wheel can now rotate at the speed specified in the control object for that wheel.

Retract Time

The retract time is specified in the model definitions window under “retract time”. It is the time required for the landing gear to retract or extend. The time being entered in the window was being over ridden by a fixed value of 1 second. This has been fixed so you can now properly specify the retract time.

You can download the new release from the download page.

Good Digital Modeling!
Sunday Flyer Software

Posted in General Info | Leave a comment

DAM 2.2 Now Available

January 22, 2013

It’s been exactly one month since the release of version 2.1, and we have been busy. Yesterday we posted the install package for DAM 2.2 build 7441.13021 on the website download page.

This is a minor upgrade with one really cool major feature. It includes the following changes:

Height Maps

The terrain generator now allows you to use any picture as a height map. The principle is simple. You can choose a bitmap (jpg or bmp picture file) and tell the terrain generator to base the height of the terrain on the picture. The terrain will be high where the picture is white and low where the picture is black. The height multiplier, center flat, and mid-ridge all work in conjunction with the height map. While we were working on the terrain generator, we added a smooth and sharp option to the mid-ridge functions. Here are a few examples of what can be done.


This example shows what can be done with a combination of math and image. The “hills” are rich with detail to fly over, into and through.


Here we used the simple blue lines shown in the requester. The same image was used as a blend at 25% to color the valleys! This is easy, since the mapping type “Z Projection” duplicates the position of the height map exactly with the position of the texture map.


Here a noise texture (generated in the free and powerful paint program Gimp 2) is combined with a Mid-Ridge math function set to “Smooth”. Note that the noise is set to 0.0. This makes the relationship between the height map and the terrain easier to see. If you add noise, it adds additional detail to the terrain that is not present in the height map.


This final sample shows how simply you can position your mountains and valleys using the height map. Note that the image used is not shown in the requester in this picture, but you can see the one used in the center panel of the requester in the previous picture.

Note that you may be tempted to use very high resolutions on the ground grid. This is fine, as long as you have a graphics card that can handle it. But be aware that if you are going to share your fields, some users do not have the latest and greatest cards.

New Sketch Helper Tool

If you have created a fuselage using the “D” method that we showed in the tutorial video on the website, you may have noticed how hard it was to make sure the two points on the flat edge of the “D” were exactly on the 0 vertical. We noticed too. So we created a new tool that makes it easier. You simply select the “D” polygon, then right click anywhere in the sketch window. You’ll see a new context menu item, “Correct Flat Edge of “D” Former Poly”. If you hover over it you’ll see you can choose to “Snap closest 2 points to vertical” or “Snap closest 2 points to horizontal”. As you can infer, the vertical option finds the 2 points that are already closest to the sketch vertical center line, and makes sure they are exactly on the center line. This is the one you’ll use most often if you draw your fuselages like we show in the tutorial video. By the way, someone out there made a similar video for another 3D product that is exactly like ours. Compliments are always welcome, even if they are in the form of imitation. It’s a great way to insure perfect symmetry.


This picture shows a simple former polygon. The two points on the right of the shape should be located exactly on the vertical center line of the sketch. The image shows the context menu open with the tool item visible.


Here you can see the change in the position of the two rightmost points after the tool has been used. They are now exactly where they needed to be.

Speed Up

You may have noticed that applying Shading to an object with a lot of polys can take a long time. DAM uses a polygon structure in the editor that is very friendly to editing, but not to speed. (A different structure is used in the flying routines.) The time is needed for a long sort and comparison OF every point in the object that happens FOR every point in the object. Worse, a similar procedure is needed for shaded objects anytime you do an operation that needs an undo buffer, like change the object’s color or point location. And worse still, a similar procedure is needed when loading drawings that have large shaded objects in them. We made a 240×240 terrain to use as a test. This is a far higher resolution than should ever be needed. “Normal” terrains are about 36×36, with 72×72 being very detailed. The 240×240 terrain has 115200 triangles in it, requiring a whopping 13271040000 floating point comparisons for its point coordinates! On my 64 bit Alienware, a 240×240 terrain took 5 minutes and 30 seconds to load. We worked on the routines nonstop until we were satisfied with the results. The same terrain now loads in just under 7 seconds! You’ll see similar speed up in shading routines and in the undo buffer preparation.

Here is an image of the requester showing progress of the shading requester. You’ll see a dramatic speed up in this operation, as well as undo buffer preparation and file loads.

New Autonomous Feature

In version 2.1, when your flying saucer runs into a mountain it simply runs up the side until it goes over the top. In version 2.2, we have added two options for this scenario. You can now choose for the saucer to “Turn” or “Bounce”. The options are pretty self explanatory. If they are both off, the saucer will behave as it did in version 2.1.


The two new gadgets are available in the Autonomous Air panel of the Control Object editing window.

Version 2.2 is ready for download on the website download page now.

That’s all for now.
Good Digital Flying – and Fighting!
Greg Gorby
Sunday Flyer Software

Posted in General Info | Leave a comment

Battle Field Castle

This is a modified version of Battle Field 1. We’ve modified the terrain with a couple of new tools available in the soon to be released DAM version 2.2. The new version will be available very soon, so keep an eye out. As always, we’ll announce it’s release here on the blog as soon as it is ready, which may be as early as tonight!

The new terrain is a LOT more detailed than we usually make (more polygons) so it needs more graphical power from your graphics card. If you notice the frame rate on the field is lower than you are used to, this is part of the reason. You can always edit the terrain and reduce the number of polygons. You’ll find we used an angular division of 180 and radial division of 60. This makes for 10800 cells in the terrain, and since there are 2 triangles per cell, 21600 polygons. On my GTX460 this is not a problem, but on my 10 year old dell desktop, the frame rate is a little slow. The terrain actually looks pretty good using as low a resolutino as 36×12, but there are far fewer details.

If you edit this terrain in a version previous to 2.2, you won’t be able to get exactly the same results, since part of the contour is from a height map, new to version 2.2.
See if you can land in the court, and take off again. You may need to taxi up to the wall and turn to give yourself a long run before takeoff. It’s also fun to fly around the turrets, as close as you can get without hitting them. You might notice that you can fly through a couple of them without crashing (the collision flag is not set).

Check it out in the User’s Area.

Good Digital Modeling!
Sunday Flyer Software

Posted in General Info | Leave a comment

DAM Whimsical Castle

I was browsing the web the other day and an ad popped up for the latest and greatest something or other. The graphic they showed was a cute little castle. I wasn’t interested in their product, but the ad did make me think a castle in a DAM flying field could be cool.

This file is the result. It isn’t drawn to any scale. I made it just big enough to be able to land in the “court”. If it isn’t big enough for you, you can practice your flying skills, taxi through the gate, or just go ahead and scale it up!

You’ll find your copy in the user’s area.

Good Digital Modeling!
Sunday Flyer Software

Posted in General Info | Leave a comment

DAM 2.1 Now Available

December 21, 2012 (yep, we’re still here!)

At Sunday Flyer Software we have been playing with DAM 2.0 almost non-stop since its release. After all, the Mayan calendar says the world is going to end today, right? Well, just in case they are wrong, we noticed a couple of things that could have been friendlier, and decided to add them now. This is a minor upgrade with a few fixes and modifications.

The new version is DAM 2.1 build 7220.12315 and is available on the download page of the website now. It includes the following changes.

Top Scores

You may have noticed that your top score was not being remembered. This was because we forgot to create the “TopScores” folder during installation. The 2.1 install package now creates this folder. You’ll now be able to compare your new scores with your previous scores as intended.

Flap and Auxiliary Sliders

The flap and auxiliary sliders on the virtual controller have been modified to work properly. If the controls were assigned to any channel when calibrating your joystick, there was no way to remove that assignment for a different joystick. To fix this we added two new gadgets to the Joystick Calibration window to allow you to remove prior assignments. Once you have unassigned them, you can use the mouse to move the sliders, or you can use the keyboard. Many of the current models are designed to have flaps. The auxiliary slider is useful for other actions. One that I’ve played with is variable-sweep wings, like those on the Dassault Mirage, the Australian F-111, Tornado F3, and many others. We’ll create one of these aircraft and distribute on the User’s Model Pages sometime soon. If you beat us to it, don’t forget to submit it for others!

Shown is the Beechcraft Sierra with flaps extended. The virtual interface (bottom right) has the flap slider shown in red as the mouse adjusts its position. The auxiliary slider is just to the right of the flap slider.

Autonomous Object

You may have tried to add “wheels” to your autonomous ground vehicles. In 2.0 if you chose to rotate objects assigned to an autonomous object relative to velocity (ie create wheels), the velocity of the model was used instead of the velocity of the AO. This has been fixed. It is now possible to make the wheels on your AO’s rotate relative to their speed. We’ll create one and publish it to the user’s area soon that you can examine to see how this can be done. Again, you don’t have to wait for us. You can create your own and send it in for others to enjoy.

Shown is the Truck autonomous object. You can see the wheel control object as a red line protruding from the center of the tire.

Camera Shake

When there are a large number of incoming, the camera shake could become huge! It became impossible to see which way was up. This became obvious in the “Classic Field” available in the user’s area. Some of those saucers can shoot 6 rounds per second! This has been fixed so you don’t become quite so disoriented.

User Model Sharing

In 2.0, if you want to share your aircraft or field, you needed to find out which textures and sounds were in use. This could be a daunting task. We added a new save option that finds all of the textures and sounds in use and saves them along with the DAM drawing to a folder you specify. This makes it much easier to share your aircraft or field. You’ll find the new save option under the Web item on the main menu dropdown list. To use it, create a new folder and save there. You will find the DAM drawing and all required files. After the save is complete, go to the folder in windows explorer. Select all of the files. Right click on the drawing and select “Send to” then “Compressed (zipped) Folder”. When the zip file is created you can rename it to anything you like, but do not change the file type (.zip). This is the file you can send when you share the aircraft or field.

Shown is the new save option location.

That’s all for now.

Good Digital Flying – and Fighting!
Greg Gorby
Sunday Flyer Software

Posted in General Info | Leave a comment

Classic Battle Field

As promised, here is a battle field that features the Classic Saucers. Imagine you are in the classic ’56 film. The Saucers even make a sound very much like in the movie.

We’ve set this field to have only 6 levels of game play. As you may expect, the levels start easy and get progressively harder. As the levels increase, not only are there more enemy, but they also have more speed, and their weapons have higher fire rates.

After you fail to finish all 6 levels with your stock planes, try increasing your model’s speed by increasing the motor’s RPM. Another thing you can do to help is increase your gun’s muzzle velocity. Still not happy? Try increasing your missile’s thrust and burn time. Decreasing the missile’s “Launch Delay” will also increase the rate of fire of the missles. (You probably shouldn’t go below about 0.2, which is 5 missiles per second!)

Download the Classic Battle Field Now

You can download these new field weapons from Page 4 of the User’s Area.

Enjoy!
Sunday Flyer Software

Posted in General Info | Leave a comment

Classic Flying Saucers!

There have been many really imaginative, truly awe inspiring space craft in the movies over the years, but for me the seminal design was from the 1956 thriller Earth vs Flying Saucers. This simple disk with its elegant dome and funny antenna shaped weapon hanging out of the bottom was absolutely fascinating to watch for movie goers of the era. Let me tell you it was an unforgetable joy for those of us who were lucky enough to see it under the stars on the local drive-in screen.

Now you can see these classic saucer designs come alive again in your field! I’ve tried to capture the feeling of the originals. I hope you agree it comes pretty close :)

How to use

This is the first field weapon we’ve published as a downloadable file. You use it a little differently than the models you have been downloading and flying. the models are stand alone complete spaces. You load them and go flying. The field weapons are not stand alone complete. They need a field to live in. Make a folder for the file you download. Unzip the contents of the file into the folder. Run DAM and load a field and a model. They are ready to go fly. But before you do, we need to get the new field weapon into the field. Load the field weapon (in this case, the file “Classic_Flying_Saucer.dam”. It will open in a third space (or tab), this time a “work” space. Now select the top item in the object list. This will cause all the items in the space to be selected. Copy them. Activate the field space and paste it in.

That’s all you have to do. You can now go flying and you’ll see the new flying saucer flying around the sky. If your model has weapons, you can go shoot it down!

Modify the speed and weapons!

You can also select the new flying saucer (again, select the top item in the list so all the objects in the flying saucer are selected), copy it and paste it. You’ll see another flying saucer appear. Do it again until you have 5 or 6, then go flying. You will see all of them flying around, ready for target practice.

Change their starting position

You can also select one and translate it to somewhere else in the field. This is the position where the saucer will appear when the level begins.

Change their speed

Don’t forget you can change the speed and altitude of the saucer by right clicking on the top control object and selecting “Control Object”, “Edit this Control Object”. The window that opens allows you to change the parameters in any way you see fit. In the near future I’ll write an entry detailing the variables, or publish a pdf on the subject, but for now just play hacker! They are pretty self explanatory and you’ll get the idea quickly.

Modify their weapons!

If you load the saucer with weapon, it’s fun to change the saucers gun. Expand the object tree until you see “Field Gun CO” and expand this item so you see “Shell CO (field gun bullet)”. Right click on this item and choose “Control Object”, “Edit this control object”. The window that opens allows you to specify all kinds of things about the gun’s bullet. See the gadget for “Rounds Per Sec”? Change it to 6 rounds per second and watch how the weapon changes. As you can infer, a value of 0.5 would be one bullet every 2 seconds, 0.25 would be a bullet every 4 seconds, and 0.1 would be a bullet every 10 seconds. Get the idea?

You can make the gun as accurate as you want. The accuracy is mostly affected by the “Muzzle Velocity”. The higher the velocity, the more accurate the gun. If the “smart” tag is on in the “Field Gun CO”, the gun will not only track where the model is. It will predict where the model will be when the bullet arrives! Any change in flight speed or direction you make between the time the bullet fires and the bullet arrives will allow you to avoid the incoming bullet. The higher velocity means the bullet will arrive in a shorter time making it harder for you to avoid it. Of course this time is also shorter when you are close to the gun.

If you change the velocity from the 8000 to, say 24000, the bullet is going to be a whole lot harder to elude. Try it and see.

Download them now

You can download these new field weapons from the Page 4 of the User’s Area.

We’ll create a field featuring these Classic Saucers and publish it soon.

Good Digital Modeling!

Digital Aircraft Modeler
Sunday Flyer Software

Posted in General Info | Leave a comment