CGTalk > Techniques > Texturing and Surfacing
Login register
Thread Closed share thread « Previous Thread | Next Thread »
 
Thread Tools Search this Thread Display Modes
Old 05-09-2002, 09:33 AM   #1
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791


PHOTOREALISTIC TEXTURING FOR DUMMIES
Part 2
Standard Projection Techniques vs The Painstaking Art of UV Mapping

What on earth is UV Mapping?

"UVs" is a way of saying u,v texture coordinates (as opposed to the X, Y, and Z axis that you construct your meshes on), which are points which define 1-by-1 positions within an image. These obviously connect to points in your 3D model, to position an image texture onto it's surface. Kind of like virtual "thumb tacks", what they do is pin an exact spot on an image that you wish to use to texture your model to a specific point on an object's surface. Between these points, your software will stretch the image smoothly. This is what is referred to as UV mapping.
So why use UV coordinates instead of standard projections?
Well, once you have made your model, and are ready to texture it, the simplest way to apply your texture map is by using a standard planar, cylindrical, spherical or cubic projection. Here is a brief explanation of each of these, and how they are best used:

Planar is a method whereby an image is projected straight through the object along either the x, y, or z axis. This method is especially useful for items such as sheets of paper, posters, book covers, etc – in other words, flat objects. The problem with planar projections is that if the texture is projected along an uneven surface, or if the image reaches a side that curves away from the projection's plane, it results in unsightly lines such as in Figure A. When this happens, you then have to create lots of alpha-channel enabled images to cover up seams between adjacent planar projections and invariably ends up becoming a huge amount of annoying work. So never project a single image through an entire object if it has depth, like the box in the image, or if it has a very non-planar or irregular surface. Rather, as in the case of this box, create separate projections for the x and y axis as well, making sure that their edges will blend together properly. Alternatively, ensure the image to be used is tileable (seamless), and use a cubic projection (which I will discuss in a moment).
Most software has a bitmap fit/automatic sizing option that will stretch the image to fit the surface properly. Obviously, if your image is not the same shape as the surface onto which you are projecting it, this fit option will stretch it until it does. This usually doesn't look too fantastic, so ensure that you measure the size of your object before making your image map.

Cylindrical projection is pretty self-explanatory. Basically what happens is your image is wrapped in a cylindrical fashion around your model along one of it's axis. This is really useful for one kind of object only – cylindrical objects. Please don't try and use this for anything else. When making an image that will be used for cylindrical projection, ensure that it's sides will meet correctly – in other words, where the two sides of the image wrap around and come together, make sure that there is no visible seam, as in Figure B.

A useful way of ensuring that the sides of an image will meet and merge properly is by using the Offset filter in Photoshop (listed under Filters/Other/Offset), and offsetting the image by however many pixels you choose, and using the Wrap Around option.

Spherical projection is when the image is stretched from one pole to the other along the axis you choose, and then wrapped around the sides from the back meridian. Make sense? Basically what I mean, is that, say for instance, you do a spherical projection along the Y axis, then the image goes straight from the top point down to the bottom point, and wraps itself around so that the two sides of the image meet along a straight line down the side of the sphere - this line is known as a meridian. Once again, only ever use spherical projection for spheres. Use it on any other kind of shape, and, well, it's not going to look very nice… Also, be sure to use the Offset filter (described above) to check that your two end will meet properly along the meridian.

Another useful way of checking whether a spherical map will work nicely is to use the Polar Coordinates filter (listed under Filters/Distort/Polar Coordinates) and use the Rectangular to Polar option. (However – ONLY USE THIS FILTER TO CHECK YOUR IMAGE. No NOT save your image that you want to use with this filter applied – it is not going to work!). This can give you an idea or whether there will be any seams when the image is wrapped around the sphere. This method is of course extremely popular for newbies to map their images onto the planets they make for those sci-fi scenes that just about everyone makes when they are starting out in 3D. Come on, admit it, you have all made sci-fi scenes, haven't you? Use the methods I've described here to ensure that your planet doesn't have any unsightly seams tearing across it's surface.

Cubic projection just repeats a single image on each side of a box model it is applied to. Cubic mapping is basically a planar projection from 6 sides. Once again, ensure that the edges of the image will not form seams. Cubic projection is really only limited to perfectly square models, because if you try and use it on a rectangular shaped box, it will stretch the image on the long sides, and squash it on the shorter sides. Which looks pretty awful.

So, back to the original question – why use UV mapping instead of these options? Well, as you have seen, these projection methods are very limited. It's pretty obvious that they are not going to suffice for extremely complex models. But here is something bizarre – these projection techniques are actually, technically speaking, more accurate than UV mapping. This is because texture images will be more accurately mapped using standard projections, which have some exact, continuous values over the entire surface, whereas a UV map has accurate samples of the projection only at specific points (where the polygons join, basically), between which it then uses a linear interpolation on the surface between those points. For non-English speaking people, interpolation is, basically speaking, an estimation of values which go together to form a continuous series – this being a series of colour/tonal values being applied to your model, and the interpolation being the application of the parts of the image, which are not "tacked" down at those specific points, to the areas between them. The cool thing about this, however, is that once you have applied to UV coordinates to the model, pulling these points on your UV map around will pull the image with it. Pretty useful, hey?
__________________
leighvanderbyl.com

Last edited by Leigh : 05-09-2002 at 02:43 PM.
 
Old 05-09-2002, 09:35 AM   #2
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
UV Unwrapping

Once your model is complete (and I cannot stress enough how important it is to only ever start texturing your model once it is completely finished. Never begin texturing until your modelling is 100% finished. This just makes the entire process run much smoother), you are ready to decide whether your model requires UV mapping or not. And seeing as this chapter is about UV mapping, I'm going to assume your model does need it.

First, you need to decide what method of unwrapping you are going to use (unwrapping being the term most commonly used for the actual process whereby the X, Y and Z information is translated into the flat UV template). Yes, I know it can be so tiresome that everything has to have so many options, but it would all be pretty boring and not much fun at all if we didn't have all these different methods, now would it?
Now, seeing as I personally am a Lightwave user, I am only really familiar with Lightwave's unwrapping techniques. I am sure, however, that these different methods are common to all the major 3D applications, but if there are any other ones that you may use in your software, be sure to post it here too.
So, here are the different UV unwrapping options:

Planar Once again, we have a planar option. Yes, it's basically the same as before. The resulting UV coordinates are basically a flattened out straight-on projection through the surface along the desired axis. One thing to note, however, is that UV templates are always perfectly square (remember what I said about 1-by-1 image proportions?), so what often happens is that your resulting UV map can look somewhat squashed. Don't worry about that, you can change it by polling your UV points with the UV map itself without actually altering the actual geometry of the object. But more about editing UV's later on. I personally use the Planar unwrapping more than any other method, as it generally produces the simplest maps with which to work.

Cylindrical Yes, it's the cylindrical option again. And yes it's also basically the same as before. One thing to watch out for, is that if your cylinder object has a top that you wish to include in the unwrap, be sure to unwrap along the X or Z axis only, as unwrapping along the Y axis will leave you with a completely flattened top.

Spherical Ok, you guessed it. It's also the same as before. You are probably wondering why you should bother using UV unwrapping if what they do is basically the same as the standard projection types, but as I said, the power behind Uvs is in the way that they "stick" to the points of your model and can be edited without affecting your models geometry.

Atlas This method of unwrapping may go by a different name in other applications, or may not be an option at all in some programs. Basically, Atlas unwrapping produces a UV template that translates the surface information into a UV map that represents the models polygons in a projection whereby once it is painted onto, will produce an image that will remain constantly perpendicular to the face normals of the surface polygons. Simply speaking, it is like taking a ball of paper that you have bunched up into an extremely irregular ball, and flattening it out again. The problem with Atlas unwrapping is that the resulting map is often a terrifying and confusing mess of disjointed polygons all over the show, as in Figure C. This kind of projection, although ideally useful, often ends up needing a lot of editing to get it into a state from which to work. I try and avoid it.

As I said before, I generally tend to use planar unwrapping the most. The problem occurring from this is that obviously when texturing, say for example, a character's body, multiple planar unwraps are going to be required (for instance, just the upper part of my Anubis character has 11 different planar UV maps applied to it), and because I make these all in separate files, what often happens is I end up with visible seams where the polygons which are using the different UV maps join. One way of covering them up is to make seam images which blend the different UV mapped surfaces into each other. There is another, easier method of avoiding this: When doing multiple unwraps for a single surface (as is the norm), choose a base colour that will be used as the base for all the different UV map images. Then, when painting onto the individual maps, just ensure that the detail you add lies a couple of pixels within the seam, that way, where all the UV maps meet, there is only that base colour between them so the seams will not be visible. The same goes for bump, spec, etc maps – make sure that no detail "breaks" the borders of the polygons within the UV map, that would then become noticeable when they do not continue on the polygons using different UV maps surrounding them.

So what do you do now that you have the unwrapped UV map?

Firstly, if any editing of the UV map is required, then do so. Your 3D program will have a bunch of tools that you can use to edit the map, and as I said before, remember that altering this map is not going to affect your geometry in any way. Most UV unwraps will need some editing as fragmentation often occurs, resulting in polys that actually lie adjacent to each other being displayed on opposite ends of the template. Edit your map until you are satisfied that you can work well with it, and then you are ready to apply an image to it.
You two options now:
The first option you use if you have already created an image map that you now wish to apply to the UV map. Change one of your viewports to display the UV map. Now, just stick the image you have made into the background behind the UV map, and pull the points of the map until they sit in the correct positions in correlation to the image. This is a rather bizarre way of doing it though, I must say that I personally have never used this method.
The second method is to export this template to Photoshop (or whatever painting program you use). There are two ways to do this – some Unwrap plugins will create an image for you, which you can then open up in Photoshop, or you can just get a screengrab (using the PrintScrn button next to your Scroll Lock key), go to Photoshop, go to New Image (the image size will already be there, defaulted to the resolution your OS is running in), and Paste. Then just trim the square UV template (make sure you do this!! Lots of people have come to me asking why their UV maps aren't working, and it often ends up that they didn't trim the image down to the square size) and you are ready to begin painting.

As I discussed in Part 1, image size is important when making texture maps. To refresh your memory:
In order to determine what size you should make it, you need to know what the final rendered frame size of the animation is going to be.
Once you know what the final size is, then you can work out the size of your texture map as follows:

Take the maximum width that the texture map can appear on the screen (in pixels) and multiply it by two. Use this pixel size as the size of your image map, if you want to ensure that your textures do not become blurry or pixellated when viewed up close.
For example, the most common frame size when rendering for television is 720 pixels X 576 pixels (PAL D1), so if you were to make a texture image for an object that will be viewed right up close in the frame, then the width of your texture map should not be less than 1440 pixels. I usually work with square images, as I almost always work with UV Unwrapping, so my images are generally at least 1440 x 1440 pixels. It's usually safe to leave the image at 72 Dpi, as this is the resolution that monitors and televisions display at. Of course, the drawback to this is that these kinds of file sizes for image maps do slow down the rendering process quite a bit, but on the other hand, you know they will hold close-up. So if you have a job that is going to end up on IMAX, you had better make sure your computer can handle 4000 x 4000 pixel images….
__________________
leighvanderbyl.com

Last edited by Leigh : 05-09-2002 at 02:34 PM.
 
Old 05-09-2002, 09:41 AM   #3
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791


PHOTOREALISTIC TEXTURING FOR DUMMIES
Part 3
How To Make Great Colour Maps

Introduction

Now that you (hopefully) understand what texture projections and UV unwrapping options you have available, and you know how to use them correctly, you are ready to begin making the actual image maps to be used to make up the textures for your model.
Now, just as careful planning is always required before you being modelling, so it is also required for the texturing process.

Being primarily a texture artist myself, when we are just beginning a project at work, I usually immediately begin researching possible ideas for the textures which are going to be used on the final models. It is very important to plan the look you want your models to have in the end, and gathering as many possible references as you can is a good start.

The internet is obviously extremely useful for scrounging for pictures of bark, metal, trees, water, Velcro, skin… whatever different surfaces you are going to need to make for your models. The problem, however, with looking on the net is that most pictures you come across are very low resolution or just plain bad quality. However, it can still be a good place to start. Once you have spotted a certain metal or bizarre animal skin that you like the look of, go down to your local library and see if you can't find some good large images of the substances you are wanting to recreate. Also, if you have access to a decent camera, go running around and look to see if you can't find some good references in the world around you. But don't do this to the detriment of your health – many times I have wished that I could climb up to the rusty old watertanks perched on the seventh storey roof of the building where I work to get some close up shots of all that lovely rust… but alas, I fear a fall from that height is likely to leave me with my brains leaking onto the parking lot below and my limbs all mangled. Which is really going to hinder my texturing abilities…

Now, as you all know, I love painting my own textures. And because that is what these workshops are really about, I'm going to be focusing on that.
Yes, photographs are essential texturing references, but I very rarely use any portions of photos in my actual image maps. This is because most photos require a lot of editing to remove lighting from them, and secondly because painting your own textures from scratch is much more fun, and more rewarding.

Right, so we have established that before you start, you must have a really good idea of what you want your textures to look like. Have all your reference images close at hand, or, even better, on your computer so that you can refer to them as needed.
Now I guess the most obvious place to start is to make your colour images. This is because your colour images set the tone of your model and give a very clear indication to you (and your clients) of what direction you are going in, and what sort of "feel" your model is going to have.

How To Make Really Great Colour Maps

Firstly, a good reason to have all your reference images on your computer is so that you can take them into Photoshop and use that handy little eyedropper tool to sample colours out of them. That way you can ensure that your airbrushed images contain all the correct tones for the surface you are making. However, before going into too much depth about the actual painting process, just a quick word on photographs:
If you want to use a photo, or a portion of a photo, in your image map, it is extremely important to ensure that you first remove all trace of light from them. For instance, look at Figure B. Now that image will not work very well as a colour map because there is lighting in it. When looking at the actual colour of that surface, the areas where there are highlights are not actually white, and the areas where there are shadows are not actually dark like that. With a bit of editing, you can remove that light information so that it becomes more like Figure A. There are a number of ways that you can do this, depending on the image, and how the lighting needs to be removed. Sometimes just some simple Hue / Saturation adjustments, of Levels adjustments will do the trick, other times you will have to actually go in and manually paint it out. The same photo technique applies no matter what channel the image is going to be used in. Lots of people would just use this image as a colour map, as well as a bump map, even though, if you look at that image, you will see that it will actually not work as a bump map at all.

Another EXTREMELY important note: Never ever ever ever use any of Photoshop's texture filters on your image maps. Just don't even think about it. This causes exactly the same problem as photos that contain lighting information. I know that the little texturizer filter can seem tempting, but DON'T use it.
__________________
leighvanderbyl.com

Last edited by Leigh : 05-09-2002 at 02:50 PM.
 
Old 05-09-2002, 09:45 AM   #4
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
Okay now you are ready to start. I am going to use the colour map that I am using on my Anubis's chest and torso front as an example here. Firstly, I load up my UV Map that I made for the front part of his upper body, see Figure C. Generally I find the initial colours of the screengrab a bit disconcerting because the grey in it tends to make you lose your cursor while painting on it, so I usually darken it a bit with Levels.
Then I decide on a basic colour and paint over the entire thing with that colour. Once I am happy with that base colour, I begin adding detail bit by bit.
The Airbrush tool and the Paintbrush tool can generally do the job here, but I personally also use the Dodge and Burn tools just to create different values of the base colour and well as variations of the tones that I am adding. It is important to start on a new layer whenever you add a major detail – such as the cuts that he has on his body in Figure D. That way, if you don't like the way it turns out, you can remove it without a long cover-up operation on the original layer.
An extremely strong attention to detail is, of course, always required for texturing. Even if you don't think anyone will ever notice the detail you are adding, don't let that stop you from putting it there. The chances are that if you don't add it, the final texture will seem to be lacking something…
Have a look at the areas surrounding the cuts. I've added rough bruising around the wounds, and because he is supposed to look gross and dead, I've used a rather revolting selection of browns and greens and yellows.
An important thing to keep in mind is the condition of the surface, and how to ensure that your colour map is going to work correctly with your bump and specular maps (as these two maps are often used to define the textures physical condition). Say for instance that you have to texture a piece of metal that has been painted, but is old and scratched. The areas where is has been scratched which you will be making in your bump map, must have the paint scratched off. I know this is pretty obvious, but I'm just pointing it out for beginners. So, throughout the process of making all the different image maps, always keep in mind the relationships between the different surface channel.

I find the best way to do this is to do all the different images for a single UV map in the same Photoshop file, each on their own set of layers. That way I can copy, for instance, the wounds on his body (which I did on their own layer, seeing as they were a major detail) to the bump layer to ensure that the bump map has the cut positioned correctly. Unfortunately this method does result in rather large Photoshop files which can really bog down your system as well as use up a lot of hard drive space. It's really up to your own personal preference, but this really does make things a lot smoother and easier to manage.
__________________
leighvanderbyl.com

Last edited by Leigh : 05-09-2002 at 02:47 PM.
 
Old 05-09-2002, 09:52 AM   #5
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
Well there really isn't much more that I can say on colour maps as they are actually the most straightforward of all the image maps that you will be making for your model.
I'd just like to say once again, that you must always ensure that you have all the correct and realistic details that your texture needs. For instance, if you are texturing pipes which are inside sewers, they are going to be really dirty and disgusting. If you are texturing a chair which goes inside a dentist's surgery, make it pretty clean. If you are texturing canal walls, add drips and water damage and streaks down the sides where the walls have been weathered over the years. Think about where your object is and how the world affects it from day to day. Even the most cleanliest of environments gather grime - if you look around a sterile biochemical laboratory, you are bound to find dust caked in the corners, and faint marks from people's shoes on the floor. And obviously it is the colour map that tells people how clean or dirty your objects are. Outside environments are rife with damage and dirt and streaks from rain. Make sure you incorporate these into your image maps, or your renders will end up looking fake and unbelievable. All too often people texture their models to look far too clean, resulting in a giveaway cg look - a classic example being the visual effects in Star Trek. Everything in Star Trek looks far too perfect and new, and you can't help but ask yourself just how do they manage to get that huge spaceship through a intergalactic car wash everyday? A gigantic hulking spaceship is most definitely going to pick up a lot of damage from flying around asteroid fields and going through rips in the fabric of time. Just look around you, notice how nothing really has a perfect solid continous colour across it's surface. Notice how and where dust and grime gathers on things. Now put these details into your colour maps! Have a look at this render I did a couple of years ago in Max - see how I added weathering damage to the walls. Without those streaks and splotches that would obviously come mostly from rain and damp, this building would not be believable as a 13-century monestary forge. Unfortunately, I do not a have a huge selection of good colour maps handy to put here to show you, but I will be looking for some over the next day or two to add to this thread. Have a look at this month's challenge entries - people like Rob Pauza and OZ have made very cool colour maps which they posted into their threads.

Once again, everybody please feel free to add all your own tips and suggestions to this thread. Post images of your own colour maps, and share your own ideas. If you have any questions, go ahead and ask. Lets hope that this chapter arouses as much participation in everyone as the last one did
__________________
leighvanderbyl.com
 
Old 05-09-2002, 11:43 AM   #6
OggieBoogie
Frequenter
 
OggieBoogie's Avatar
portfolio
Marko Ljubez
Digital Artist
ILM
Sweden
 
Join Date: Dec 2001
Posts: 210
Hey Leigh!


Do u ever sleap??!!!

hehe, this is good info, great job, thx for ur effort!!:airguitar

Cheers
__________________
My posts do not under, any circumstances, represent, nor reflect the opinions of, my employer.

www.markoljubez.com
 
Old 05-09-2002, 01:00 PM   #7
merlin9876
Spells & sorcery
 
Join Date: Apr 2002
Posts: 134
Thanks, great stuff like the first one! Could you please link to your Word files like you did for the first one? Thanks a bunch and I hope this won't spawn as much controversy as part 1!

p.s.: woohoo 100 posts!
__________________
Merlin
"Searching for magic everywhere..."
 
Old 05-09-2002, 01:16 PM   #8
jman
New Member
 
jman's Avatar
Tube Studios
 
Join Date: May 2002
Posts: 29
Again thank's Leigh for eveything.
You are doing a great job
 
Old 05-09-2002, 01:33 PM   #9
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
Here are PDF versions of the tutorials.

Part 2

Part 3
__________________
leighvanderbyl.com

Last edited by Leigh : 05-09-2002 at 02:09 PM.
 
Old 05-09-2002, 02:02 PM   #10
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
And here is a plain text version...
__________________
leighvanderbyl.com
 
Old 05-09-2002, 03:02 PM   #11
HapZungLam
Lord of the posts
 
HapZungLam's Avatar
portfolio
Patrick Wong
Modeling Grunt
Vancouver, Canada
 
Join Date: Feb 2002
Posts: 2,226
Send a message via ICQ to HapZungLam Send a message via MSN to HapZungLam

do you have to .doc file for part 1?
 
Old 05-09-2002, 03:10 PM   #12
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
Nope, only the Rich Text document in the zip file above, and the plain text one.
__________________
leighvanderbyl.com
 
Old 05-09-2002, 03:25 PM   #13
sireel
must...save...world
 
sireel's Avatar
portfolio
Jim Sim
USA
 
Join Date: Apr 2002
Posts: 574
Do you have it in .lazy format? I don't want to do the work of copying and pasting it to a another screen

Hey Leigh your awesome, thanks for this tut. and all of the work it involved.
__________________
Jim Sim
jim.simstudios.net
 
Old 05-09-2002, 03:38 PM   #14
leigh
blahblah
 
leigh's Avatar
CGSociety Staff
portfolio
Leigh van der Byl
A cog in the wheel
Hertfordshire, United Kingdom
 
Join Date: Feb 2002
Posts: 29,791
hehehehe just download the zip file a couple of posts up It has the entire text document and all the pictures.

And writing this stuff is my pleasure Glad you enjoyed it.
__________________
leighvanderbyl.com
 
Old 05-09-2002, 03:44 PM   #15
LucentDreams
lover of gophers
 
LucentDreams's Avatar
CGSociety Member
portfolio
Kai Pedersen
Lighting Lead
Double Negative
Vancouver, Canada
 
Join Date: Mar 2002
Posts: 10,362
Tired and almost thoughtless

Hey Leight Great stuff, I have a question for you on UV mapping. How loong on average does it take you to edit your mapping. I notice that yours was quite clean and even really well done. Also, what projection do you typically use?
__________________
Quote:
"Until you do what you believe in, how do you know whether you believe in it or not?" -Leo Tolstoy
Kai Pedersen
 
Thread Closed share thread


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
CGSociety
Society of Digital Artists
www.cgsociety.org

Powered by vBulletin
Copyright ©2000 - 2006,
Jelsoft Enterprises Ltd.
Minimize Ads
Forum Jump
Miscellaneous

All times are GMT. The time now is 04:47 PM.


Powered by vBulletin
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.