+-
+-Jhead is a command line driven program for manipulating the non-image parts of Exif flavour
+-JPEG files that most digital cameras produce.
+-
+-Windows / Mac users: Jhead has no Graphical User Interface. Clicking on it with the mouse from Windows
+-or Mac OS-X won't do anything for you - you have to use it from the Command prompt
+-
+-
+-
Jhead v3.03 program Features
+-
+-- Extracting camera settings from Exif image files
+-
- Able to set and/or adjust the Exif time field
+-
- Manipulation (extract, replace, regenerate) of Exif integral thumbnails
+-
- Transplant Exif image header from one JPEG to another
+-
- Edit JPEG comment fields
+-
- Automatically rotate images upright (using jpegtran) according to "orientation" tag.
+-
- Manage running programs on large batches of Jpegs and restoring Exif header
+- information afterwards.
+-
- Display embedded GPS info (if present)
+-
+-
+-
+-General metadata options
+-
+-
+--te <name>
+- |
+- Transplant Exif header from image <name> into specified image. This option is
+- useful if you like to edit the photos but still want the Exif header on your photos.
+- As most photo editing programs will wipe out the Exif header, this option can be used
+- to re-transplant them back in after editing the photos.
+-
+- This feature has an interesting 'relative path' option for specifying the thumbnail name.
+- Whenever the <name> contains the characters '&i', jhead will substitute the original
+- filename for this name. This allows creating a 'relative name' when doing a whole
+- batch of files. For example, the incantation:
+- jhead -te "originals\&i" *.jpg
+- would transfer the Exif header for each .jpg file in the originals directory by the same name,
+- Both Win32 and most UNIX shells treat the '&' character in a special way, so you have to
+- put quotes around that command line option for the '&' to even be passed to the program.
+-
+-
+- |
-dc
+- | Delete comment field from the JPEG header. Note that the comment
+- is not part of the Exif header.
+-
+- |
-de
+- | Delete the Exif header entirely. This leaves other sections (IPTC, XMP, comment) intact
+-
+- |
-di
+- | Delete IPTC section (if present). Leaves other sections intact.
+-
+- |
-dx
+- | Delete XMP section (if present). Leaves other sections intact.
+-
+- |
-du
+- | Delete any sections that jhead doesn't know about. Leaves Exif, XMP, IPTC and comment
+- sections intact.
+-
+- |
-purejpg
+- | Delete all JPEG sections that aren't necessary for rendering the image. Strips any
+- metadata that various applications may have left in the image. A combination of
+- the -de -dc and -du options.
+-
+- |
-mkexif
+- | Creates minimal Exif header. Exif header contains date/time, and empty thumbnail
+- fields only. Date/time set to file time by default.
+- use with -rgt option if you want the Exif header to contain a thumbnail.
+- Note that Exif header creation is very limited at this time, and no other fields
+- can be added to the Exif header this way.
+-
+- |
-ce
+- | Edit the JPEG header comment field (note, this comment field is outside the Exif structure
+- and can be part of Exif and non Exif style JPEG images).
+-
+- A temporary file containing the comment is created and a text editor is launched to edit
+- the file. The editor is specified in the EDITOR environment variable. If none is specified
+- notepad or vi are used under Windows and UNIX respectively. After the editor exits,
+- the data is transferred back into the image, and the temporary file deleted.
+-
+- |
-cs <name>
+- | Save comment section to a file
+-
+- |
-ci <name>
+- | Replace comment with text from file.
+-
+- |
-cl <comment>
+- | Replace comment with comment from command line.
+- |
+-
+-
+-Date / Time manipulation options
+-
+-
+--ft
+- | Sets the file's system time stamp to what is stored in the Exif header.
+-
+- |
-dsft
+- | Sets the Exif timestamp to the file's timestamp. Requires an Exif header to pre-exist.
+- Use -mkexif option to create one if needed.
+-
+- |
-n[<fmt-string>]
+- | This option causes files to be renamed and/or moved according to the Exif header "DateTimeOriginal" field.
+- If the file is not an Exif file, or the DateTimeOriginal does not contain a valid value,
+- the file date is used.
+-
+- If the name includes '/' or '\' (under windows), this is interpreted as a new path for
+- the file. If the new path does not exist, the path will be created.
+-
+- If the [fmt-string] is omitted, the file will be renamed to MMDD-HHMMSS.
+-
+- If a [fmt-string] is provided, the fmt-string will be passed to the
+- strftime function for formatting. In addition, if the format string contains '%f', this will
+- substitute the original name of the file (minus extension).
+-
+- A sequence number may also be included by including '%i' in the format string. Leading
+- zeros can be specified. '%03i' for example will pad the numbers to '001', '002'...
+- this works just like printf in C, but with '%i' instead of '%d'.
+-
+- If the target name already exists, the name will be appended with "a", "b", "c", etc,
+- unless the name ends with a letter, in which case it will be appended with "0", "1", "2", etc.
+-
+- This feature is especially useful if more than one digital camera was used to take pictures
+- of an event. By renaming them to a scheme according to date, they will automatically
+- appear in order of taking when viewed with some sort of viewer like Xnview or AcdSee, and
+- sorted by name. Or you could use the -ft option and view the images sorted by date.
+- Typically, one of the camera's date will be set not quite right, in which case you may have
+- to use the -ta or -da options on those files first.
+-
+- Some of the more useful arguments for strftime are:
+-
+-
+- %d   | Day of month as decimal number (01 � 31)
+- | %H | Hour in 24-hour format (00 � 23)
+- | %j | Day of year as decimal number (001 � 366)
+- | %m | Month as decimal number (01 � 12)
+- | %M | Minute as decimal number (00 � 59)
+- | %S | Second as decimal number (00 � 59)
+- | %U | Week of year as decimal number, with Sunday as first day of week (00 � 53)
+- | %w | Weekday as decimal number (0 � 6; Sunday is 0)
+- | %y | Year without century, as decimal number (00 � 99)
+- | %Y | Year with century, as decimal number
+- |
+-
+- Example:
+-     jhead -n%Y%m%d-%H%M%S *.jpg
+- This will rename files matched by *.jpg according to YYYYMMDD-HHMMSS
+-
+- Note to Windows batch file users: '%' is used to deliminate macros in Windows batch files. You must
+- use %% to get one % passed to the program. So from a batch file, you would have to write "jhead -n%%Y%%m%%d-%%H%%M%%S *.jpg"
+-
+- For a full listing of strftime arguments, look up the strftime function. Note that some arguments
+- to the strftime function (not listed here) produce strings with characters such as '/' and ':' that
+- may not be valid as part of a filename on various systems.
+-
+- |
-a
+- | (Windows only option). Rename files with the same name but different extension as well.
+- This is useful for renaming .AVI files based on Exif file in .THM, or to rename sound annotation
+- files or raw files with jpeg files. Use together with '-n' option.
+-
+- |
-ta<timediff>
+- | Adjust time stored in the Exif header by h:mm forwards or backwards. Useful when having
+- taken pictures with the wrong time set on the camera, such as after travelling across
+- time zones, or when daylight savings time has changed.
+- This option uses the time from the "DateTimeOriginal" (tag 0x9003) field, but sets
+- all the time fields in the Exif header to the new value.
+-
+- Examples:
+- Adjust time one hour forward (you would use this after you forgot to set daylight savings
+- time on the camera)
+-
+- Adjust time back by 23 seconds (you would use this to get the timestamps from two cameras
+- in sync after you found that they didn't quite align)
+-
+- Adjust time forward by 2 days and 1 hour (49 hours)
+-
+-
+- |
-da<date>-<date>
+- | Works like -ta, but for specifying large date offsets, to be used when fixing dates from
+- cameras where the date was set incorrectly, such as having date and time reset by battery
+- removal on some cameras. This feature is best for adjusting dates on pictures taken
+- over a large range of dates. For pictures all taken the same date, the "-ds" option
+- is often easier to use.
+-
+- Because different months and years have different numbers of days in them, a simple offset
+- for months, days, years would lead to unexpected results at times. The time offset is
+- thus specified as a difference between two dates, so that jhead can figure out exactly
+- how many days the timestamp needs to be adjusted by, including leap years and daylight
+- savings time changes.
+- The dates are specified as yyyy:mm:dd. For sub-day adjustments, a time of day can also
+- be included, by specifying yyyy:nn:dd/hh:mm or yyyy:mm:dd/hh:mm:ss
+-
+- Examples:
+- Year on camera was set to 2004 instead of 2005 for pictures taken in April
+- jhead -da2005:03:01-2004:03:01
+- Default camera date is 2002:01:01, and date was reset on 2005:05:29 at 11:21 am
+- jhead -da2005:05:29/11:21-2002:01:01
+-
+- |
-ts<date-time>
+- | Sets the date and time stored in the Exif header to what is specified on the command line.
+- This option changes all the date fields in the Exif header.
+- Time must be specified as:
+-     yyyy:mm:dd-hh:mm:ss
+-
+- |
-tf <filename>
+- | Sets the date stored in the Exif header to the modification time from a file.
+- This option changes all the date fields in the Exif header.
+-
+- |
-ds<date-time>
+- | Sets the date stored in the Exif header to what is specified on the command line.
+- Can be used to set date, just year and month, or just year.
+- Date is specified as:
+-     yyyy:mm:dd, yyyy:mm, or yyyy
+-
+- |
+-Thumbnail manipulation options
+-
+--dt
+- | Delete thumbnails from the Exif header, but leave the
+- interesting parts intact. This option truncates the thumbnail from the Exif header, provided
+- that the thumbnail is the last part of the Exif header (which so far as I know is always the case).
+- Exif headers have a built-in thumbnail, which is typically 240x160 and 10k in size.
+- This thumbnail is used by digital cameras. Windows XP, as well
+- as various photo viewing software may also use this thumbnail if present, but work just fine
+- if it isn't.
+-
+- |
-st <name>
+- | Save the built in thumbnail from Jpegs that came from a digital camera. The thumbnail lives
+- inside the Exif header, and is a very low-res JPEG image. Note that making
+- any changes to a photo, except for with some programs, generally wipes out the Exif header
+- and with it the thumbnail.
+-
+- I implemented this option because I kept getting asked about having such an option.
+- I don't consider the
+- built in thumbnails to be all that useful - too low res. However, now you can see for
+- yourself. I always generate my thumbnails using ImageMagick (see end of this page).
+-
+- Like the '-te' option, this feature has the 'relative path' option for specifying the
+- thumbnail name.
+- Whenever the <name> contains the characters '&i', jhead will substitute the original
+- filename for this name. This allows creating a 'relative name' when doing a whole
+- batch of files. For example, the incantation:
+- jhead -st "thumbnails\&i" *.jpg
+- would create a thumbnail for each .jpg file in the thumbnails directory by the same name,
+- (provided that the thumbnails directory exists, of course).
+- Both Win32 and most UNIX shells treat the '&' character in a special way, so you have to
+- put quotes around that command line option for the '&' to even be passed to the program.
+-
+- If a '-' is specified for the output file, the thumbnail is sent to stdout. (UNIX build only)
+-
+- |
-rt <name>
+- | Replace thumbnails from the Exif header.
+- This only works if the Exif header already contains an Exif header a thumbnail.
+-
+- |
-rgt[size]
+- | Regenerate Exif thumbnail.
+- 'size' specifies maximum height or width of thumbnail.
+- I added this option because I had a lot of images that I had rotated with various tools that don't
+- update the Exif header. But newer image browsers such as XnView make use of the Exif thumbnail,
+- and so the thumbnails would be different from the image itself. Note that the rotation tag also
+- needed to be cleared (-norot option).
+-
+- Typically, only images that are shot in portrait orientation are afflicted with this. You can use
+- the -orp option to tell jhead to only operate on images that are upright.
+-
+-
+- This option relies on 'mogrify' program (from ImageMagick) to regenerate the thumbnail.
+- Linux users often already have this tool pre-installed. Windows users have to go and download it.
+- This option only works if the image already contains a thumbnail.
+- |
+-
+-Rotation tag manipulation
+-
+-
+- -autorot
+- |
+- Using the 'Orientation' tag of the Exif header, rotate the image so that it is upright.
+- The program 'jpegtran' is used to perform the rotation. This program is present in most
+- Linux distributions. For windows, you need to get a copy of it.
+- After rotation, the orientation tag of the Exif header is set to '1' (normal orientation).
+- The Exif thumbnail is also rotated. Other fields of the Exif header,
+- including dimensions are untouched, but the JPEG height/width are adjusted.
+- This feature is especially useful with newer digital cameras, which set the orientation
+- field in the Exif header automatically using a built in orientation sensor in the camera.
+-
+- |
+- -norot
+- |
+- Clears the Exif header rotation tag without altering the image.
+- You may find that your images have rotation tags in them from your camera, but you already
+- rotated them with some lossless tool without clearing the rotation tag.
+- Now your friendly browser rotates the images on you again because the image rotation
+- tag still indicates the image should be rotated. Use this option to fix this problem.
+- You may also want to regenerate the thumbnail using the -rgt option.
+- |
+-
+-
+-Output verbosity control
+-
+-
+-
+--h
+- | Displays summary of command line options.
+-
+- |
-v
+- | Makes the program even more verbose than it already is. Like DOS programs, and unlike
+- UNIX programs, Jhead gives feedback as to what it is doing, even when nothing goes wrong.
+- Windows user that I am, when something doesn't give me feedback for 20 seconds, I assume
+- its crashed.
+-
+- |
-q
+- | Makes the program not spit out messages on success - more like the "Silence is golden" Unix way. its crashed.
+-
+- |
-V
+- | Print version info and compilation date.
+-
+- |
-exifmap
+- | Show a map of the bytes in the Exif header. Useful when analyzing strange Exif headers,
+- not of much use to non software developers.
+-
+- |
-se
+- | Suppress error messages relating to corrupt Exif header structure.
+-
+- |
-c
+- | Concise output. This causes picture info to be summarized on one line instead of several.
+- Useful for grep-ing through images, as well as importing into spread sheets (data is space
+- delimited with quotes as text qualifier).
+-
+- |
+-
+-
+-File matching and selection
+-
+-
+--model <model>
+- | Restricts processing of files to those whose camera model, as indicated by the Exif image
+- information, contains the substring specified in the argument after '-model'.
+- For example, the following command will list only images that are from an S100 camera:
+-
+- jhead -model S100 *.jpg
+-
+- I use this option to restrict my JPEG re-compressing to those images that came from my
+- Cannon S100 camera, (see the -cmd option).
+-
+- |
-quality <nn>
+- | Restricts processing of files to those whose estimated quality factor is equal to
+- or higher than the specified number nn.
+-
+- |
+--exonly
+- | Skip all files that don't have an Exif header. This skips all files that did not
+- come directly from the digital camera, as most photo editing software does not
+- preserve the Exif header when saving pictures.
+-
+- |
-cmd<command>
+- | Executes the specified command on each Jpeg file to be processed.
+- The Exif section of each file is read before running the command, and re-inserted
+- after the command finishes.
+-
+- This is useful for using Jhead's file globbing capability for processing a whole
+- directory tree of files.
+-
+- It's also useful for restoring the exif header after operations that wipe out
+- the Exif metadata. Most programs today however will keep the Exif metadata
+- intact, so this is less important than it used to be.
+-
+- |
-orp, -orl
+- | Operate only on images with portrait (-orp) or landscape (-orl) aspect ratio.
+- Please note that this is solely based on jpeg width and height values. Some browsers may auto
+- rotate the image on displaying it based on the Exif orientation tag, so that images shot
+- in portrait mode are displayed as portrait. However, the image itself may not be stored in
+- portrait orientation.
+- The -autorot and -norot options are useful for dealing with rotation issues.
+-
+- |
-r
+- | The recursive feature of version 1.0 never worked to my satisfaction, and I replaced it
+- with my recursive file globbing code in the Windows version. See below.
+-
+- |
+-
+-Bugs and Shortcomings
+-
+- After Jhead runs a program to rotate or resize an image, the image dimensions and thumbnail
+- in the Exif header are not adjusted.
+-
+- Modifying of Exif header data is very limited, as Jhead internally only has a read only
+- implementation of the file system contained in the Exif header. For the most part, Exif
+- can only modify pre-existing fixed-length fields in the header.
+-
+-
+- Most Canon digital SLR cameras fail to adjust the effective sensor resolution when shooting at less
+- than full resolution, causing Jhead to incorrectly miscalculate the sensor width and 35mm equivalent
+- focal length. The same can result from resizing photos with Photoshop, which will manipulate
+- parts of the Exif header.
+- This is often reported as a bug in Jhead, but Jhead can't do much about incorrect data.
+-
+-
+-Name globbing and recursive directories under Windows
+-
+- Name globbing means matching wildcard patterns to actual file names. If you know what this
+- term means, you are probably annoyed at how programs on Windows typically handle this.
+- The Win32 version of this program goes beyond the pattern matching that Windows provides,
+- and allows you to specify fancy UNIX-like patterns such as:
+-
+-   jhead c:\pix\199*\*\*.jpg
+-
+- This program goes one step beyond beyond that in that "**" as a path component means any
+- level of subdirectories. The invocation
+-
+-   jhead c:\**\*.jpg
+-
+- will find ALL Jpegs files on the c: drive, including those in the root directory.
+- The **
+- only works if it is the only part of that path component. For example, the path
+- 'c:\a**\*.jpg'
+- will not recurse.
+- The '**'
+- recursive expansion is ONLY supported on the Windows version. The code is in the module 'myglob.c',
+- if you want to reuse it (I certainly intend to reuse that code for other applications).
+- Under UNIX, the shell's wildcard expansion is
+- pretty decent already, and dealing with the convoluted nature of some UNIX file layouts,
+- doing better would have been much more of a challenge.
+-
+-
+-Programs I use with Jhead
+-ImageMagick
+-
+-I use the MOGIRIFY command from ImageMagick to do batch conversions and re-compresses of images.
+-If you use Linux, you probably already have ImageMagick on your system (just type 'mogrify' at the
+-command prompt to see if you have it). For Windows users, you have to download it from:
+- http://www.imagemagick.org
+-Image Magick is one of those programs that preserves comment and Exif headers, although older
+-versions do not.
+-
+-JPEGTRAN
+-
+-If you use Linux you probably also already have this program. For windows, it's hard to find a
+-pre-built binary on the web. The Independent JPEG
+-Group's website only has the source code.
+-There's a fancier version, with pre-built Windows binaries and a lossless cropping feature added at:
+- http://sylvana.net/jpegcrop.
+-
+-
+-XnView
+-
+-XnView is an excellent, small, fast, and free graphical image browser.
+-It makes use of jpeg thumbnails for the thumbnail view. On account of Xnview, I added
+-options to fix or regenerate the thumbnails to jhead, so that I could regenerate the thumbnails
+-for images where the thumbnail had gotten out of sync with the image.
+-
+-Mac and Linux versions of XnView are also available.
+-
+-
+-wrjpgcom / rdjpgcom
+-
+-You can use these programs to write and extract COM markers from JPEG images respectively. Although I always
+-use my jhead program for this feature, the wrjpgcom and rdjpgcom programs are extremely simple and very
+-suitable for use with shell scripts to process lots of images. These programs are part of most
+-Linux distributions as part of the libjpg package (along with jpegtran)
+-
+-
+-If you are looking for a feature that Jhead doesn't have, try
+-Exiftool.
+-Exiftool is actively maintained and has a LOT of features. A downside of Exiftool is that
+-it's much bigger and slower.
+-
+-For those who need a programming interface, there are:
+-libexif and
+-exifv2.
+-
+-
+-Jhead homeage: http://www.sentex.net/~mwandel/jhead
+-Last Updated: Dec 31 2018
+-
+-
+-
+diff --git a/src/meshlab/glarea.h b/src/meshlab/glarea.h
+index b124bc4..1205bcf 100644
+--- a/src/meshlab/glarea.h
++++ b/src/meshlab/glarea.h
+@@ -651,7 +651,7 @@ private:
+
+ /*
+ Given a shot "from" and a trackball "track", updates "track" with "from" extrinsics.
+- A traslation involving cameraDistance is included. This is necessary to compensate a trasformation that OpenGL performs
++ A traslation involving cameraDistance is included. This is necessary to compensate a transformation that OpenGL performs
+ at the end of the graphic pipeline.
+ */
+ template
+diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp
+index 9b27343..4a5b12d 100644
+--- a/src/meshlab/mainwindow_RunTime.cpp
++++ b/src/meshlab/mainwindow_RunTime.cpp
+@@ -49,7 +49,7 @@
+ #include "rich_parameter_gui/richparameterlistdialog.h"
+
+ #include
+-#include "../external/easyexif/exif.h"
++#include
+
+ using namespace std;
+ using namespace vcg;
+@@ -322,10 +322,10 @@ void MainWindow::updateLayerDialog()
+ layerDialog->updateDecoratorParsView();
+ MLRenderingData dt;
+ if (meshDoc()->mm() != NULL)
+- {
++ {
+ MLSceneGLSharedDataContext::PerMeshRenderingDataMap::iterator it = dtf.find(meshDoc()->mm()->id());
+ if (it != dtf.end())
+- layerDialog->updateRenderingParametersTab(meshDoc()->mm()->id(),*it);
++ layerDialog->updateRenderingParametersTab(meshDoc()->mm()->id(),*it);
+ }
+ if (globrendtoolbar != NULL)
+ {
+@@ -942,7 +942,7 @@ void MainWindow::startFilter()
+ {
+ QString enstr = missingPreconditions.join(",");
+ QMessageBox::warning(this, tr("PreConditions' Failure"), QString("Warning the filter '" + iFilter->filterName(action) + "' has not been applied.
"
+- "Current mesh does not have " + enstr + "."));
++ "Current mesh does not have " + enstr + "."));
+ return;
+ }
+
+@@ -1011,25 +1011,25 @@ void MainWindow::updateSharedContextDataAfterFilterExecution(int postcondmask,in
+ int updatemask = MeshModel::MM_NONE;
+ bool connectivitychanged = false;
+ if (((unsigned int)mm->cm.VN() != existit->_nvert) || ((unsigned int)mm->cm.FN() != existit->_nface) ||
+- bool(postcondmask & MeshModel::MM_UNKNOWN) || bool(postcondmask & MeshModel::MM_VERTNUMBER) ||
+- bool(postcondmask & MeshModel::MM_FACENUMBER) || bool(postcondmask & MeshModel::MM_FACEVERT) ||
+- bool(postcondmask & MeshModel::MM_VERTFACETOPO) || bool(postcondmask & MeshModel::MM_FACEFACETOPO))
+- {
++ bool(postcondmask & MeshModel::MM_UNKNOWN) || bool(postcondmask & MeshModel::MM_VERTNUMBER) ||
++ bool(postcondmask & MeshModel::MM_FACENUMBER) || bool(postcondmask & MeshModel::MM_FACEVERT) ||
++ bool(postcondmask & MeshModel::MM_VERTFACETOPO) || bool(postcondmask & MeshModel::MM_FACEFACETOPO))
++ {
+ updatemask = MeshModel::MM_ALL;
+ connectivitychanged = true;
+ }
+ else
+ {
+ //masks differences bitwise operator (^) -> remove the attributes that didn't apparently change + the ones that for sure changed according to the postCondition function
+- //this operation has been introduced in order to minimize problems with filters that didn't declared properly the postCondition mask
++ //this operation has been introduced in order to minimize problems with filters that didn't declared properly the postCondition mask
+ updatemask = (existit->_mask ^ mm->dataMask()) | postcondmask;
+ connectivitychanged = false;
+ }
+
+ MLRenderingData::RendAtts dttoupdate;
+- //1) we convert the meshmodel updating mask to a RendAtts structure
++ //1) we convert the meshmodel updating mask to a RendAtts structure
+ MLPoliciesStandAloneFunctions::fromMeshModelMaskToMLRenderingAtts(updatemask,dttoupdate);
+- //2) The correspondent bos to the updated rendering attributes are set to invalid
++ //2) The correspondent bos to the updated rendering attributes are set to invalid
+ shared->meshAttributesUpdated(mm->id(),connectivitychanged,dttoupdate);
+
+ //3) we took the current rendering modality for the mesh in the active gla
+@@ -1094,7 +1094,7 @@ void MainWindow::updateSharedContextDataAfterFilterExecution(int postcondmask,in
+
+ shared->setRenderingDataPerMeshView(mm->id(),GLA()->context(),curr);
+ }
+- else
++ else
+ {
+ //A new mesh has been created by the filter. I have to add it in the shared context data structure
+ newmeshcreated = true;
+@@ -1310,9 +1310,10 @@ void MainWindow::executeFilter(QAction *action, RichParameterList ¶ms, bool
+ {
+ meshDoc()->setBusy(false);
+ qApp->restoreOverrideCursor();
+- QMessageBox::warning(this, tr("Filter Failure"),
+- QString("Operating system was not able to allocate the requested memory.
"
+- "Failure of filter : '%1'
").arg(action->text())+bdall.what()); // text
++ QMessageBox::warning(
++ this, tr("Filter Failure"),
++ QString("Operating system was not able to allocate the requested memory.
"
++ "Failure of filter : '%1'
").arg(action->text())+bdall.what()); // text
+ MainWindow::globalStatusBar()->showMessage("Filter failed...",2000);
+ }
+ qb->reset();
+@@ -1622,7 +1623,7 @@ bool MainWindow::openProject(QString fileName)
+ {
+ QString relativeToProj = fi.absoluteDir().absolutePath() + "/" + (*ir).filename.c_str();
+ meshDoc()->addNewMesh(relativeToProj,relativeToProj);
+- openRes = loadMeshWithStandardParams(relativeToProj,this->meshDoc()->mm(),ir->trasformation);
++ openRes = loadMeshWithStandardParams(relativeToProj,this->meshDoc()->mm(),ir->transformation);
+ if(!openRes)
+ meshDoc()->delMesh(meshDoc()->mm());
+ }
+@@ -1658,10 +1659,10 @@ bool MainWindow::openProject(QString fileName)
+ QString model_filename;
+
+ image_list_filename = QFileDialog::getOpenFileName(
+- this , tr("Open image list file"),
+- QFileInfo(fileName).absolutePath(),
+- tr("Bundler images list file (*.txt)")
+- );
++ this,
++ tr("Open image list file"),
++ QFileInfo(fileName).absolutePath(),
++ tr("Bundler images list file (*.txt)"));
+ if(image_list_filename.isEmpty())
+ return false;
+
+@@ -1763,7 +1764,7 @@ bool MainWindow::appendProject(QString fileName)
+ {
+ QString relativeToProj = fi.absoluteDir().absolutePath() + "/" + (*ir).filename.c_str();
+ meshDoc()->addNewMesh(relativeToProj,relativeToProj);
+- if(!loadMeshWithStandardParams(relativeToProj,this->meshDoc()->mm(),(*ir).trasformation))
++ if(!loadMeshWithStandardParams(relativeToProj,this->meshDoc()->mm(),(*ir).transformation))
+ meshDoc()->delMesh(meshDoc()->mm());
+ }
+ }
+@@ -1798,10 +1799,10 @@ bool MainWindow::appendProject(QString fileName)
+ QString model_filename;
+
+ image_list_filename = QFileDialog::getOpenFileName(
+- this, tr("Open image list file"),
+- QFileInfo(fileName).absolutePath(),
+- tr("Bundler images list file (*.txt)")
+- );
++ this,
++ tr("Open image list file"),
++ QFileInfo(fileName).absolutePath(),
++ tr("Bundler images list file (*.txt)"));
+ if (image_list_filename.isEmpty())
+ return false;
+
+@@ -2758,7 +2759,7 @@ bool MainWindow::QCallBack(const int pos, const char * str)
+ void MainWindow::updateTexture(int meshid)
+ {
+ MultiViewer_Container* mvc = currentViewContainer();
+- if ((mvc == NULL) || (meshDoc() == NULL))
++ if ((mvc == NULL) || (meshDoc() == NULL))
+ return;
+
+ MLSceneGLSharedDataContext* shared = mvc->sharedDataContext();
+@@ -3217,7 +3218,7 @@ void MainWindow::updateRenderingDataAccordingToActionToAllVisibleLayers(MLRender
+
+ void MainWindow::updateRenderingDataAccordingToActions(QList actlist)
+ {
+- if (meshDoc() == NULL)
++ if (meshDoc() == NULL)
+ return;
+
+ for (int ii = 0; ii < meshDoc()->meshList.size(); ++ii)
+@@ -3326,7 +3327,7 @@ void MainWindow::switchCurrentContainer(QMdiSubWindow * subwin)
+ if (_currviewcontainer != NULL)
+ {
+ updateLayerDialog();
+- updateMenus();
++ updateMenus();
+ updateStdDialog();
+ }
+ }
+diff --git a/src/meshlab/meshlab.pro b/src/meshlab/meshlab.pro
+index c5e668b..11d3bc0 100644
+--- a/src/meshlab/meshlab.pro
++++ b/src/meshlab/meshlab.pro
+@@ -15,6 +15,7 @@ INCLUDEPATH *= \
+ . \
+ .. \
+ ../.. \
++ $$MESHLAB_EXTERNAL_DIRECTORY/easyexif \
+ $$VCGDIR \
+ $$EIGENDIR
+
+@@ -77,8 +78,7 @@ SOURCES += \
+ glarea_setting.cpp \
+ rich_parameter_gui/richparameterlistdialog.cpp \
+ rich_parameter_gui/richparameterlistframe.cpp \
+- rich_parameter_gui/richparameterwidgets.cpp \
+- ../external/easyexif/exif.cpp
++ rich_parameter_gui/richparameterwidgets.cpp
+
+ FORMS += \
+ ui/layerDialog.ui \
+diff --git a/src/meshlabplugins/decorate_base/decorate_base.cpp b/src/meshlabplugins/decorate_base/decorate_base.cpp
+index 2d8de66..f6ccbdf 100644
+--- a/src/meshlabplugins/decorate_base/decorate_base.cpp
++++ b/src/meshlabplugins/decorate_base/decorate_base.cpp
+@@ -244,8 +244,8 @@ void DecorateBasePlugin::decorateMesh(QAction *a, MeshModel &m, const RichParame
+
+ case DP_SHOW_BOX_CORNERS:
+ {
+- bool untrasformed = rm->getBool(this->BBAbsParam());
+- DrawBBoxCorner(m, untrasformed);
++ bool untransformed = rm->getBool(this->BBAbsParam());
++ DrawBBoxCorner(m, untransformed);
+
+ Point3m bmin, bmax;
+ bmin = m.cm.bbox.min;
+@@ -1083,7 +1083,7 @@ switch(ID(action))
+ {
+ case DP_SHOW_BOX_CORNERS :
+ {
+- parset.addParam(RichBool(this->BBAbsParam(), false, "Draw Untrasformed","If true the bbox is drawn in the original, untrasformed position "
++ parset.addParam(RichBool(this->BBAbsParam(), false, "Draw Untransformed","If true the bbox is drawn in the original, untransformed position "
+ "(instead of the position obtained by transforming it using the matrix associated to the current Layer)"));
+ } break;
+
+diff --git a/src/meshlabplugins/filter_isoparametrization/tangent_space.h b/src/meshlabplugins/filter_isoparametrization/tangent_space.h
+index 4ac69e6..7ee542e 100644
+--- a/src/meshlabplugins/filter_isoparametrization/tangent_space.h
++++ b/src/meshlabplugins/filter_isoparametrization/tangent_space.h
+@@ -84,7 +84,7 @@ public:
+ vcg::Point2 UVDiam;
+ ///transform to diamond coordinates
+ isoParam->GE1(I0,dest,DiamIndex,UVDiam);
+- ///trasform back to I,alpha,beta
++ ///transform back to I,alpha,beta
+ isoParam->inv_GE1(DiamIndex,UVDiam,I1,bary1);
+ domain=1;
+ return true;
+@@ -104,7 +104,7 @@ public:
+ vcg::Point2 UVHstar;
+ ///transform to UV
+ bool found=isoParam->GE0(I0,dest,StarIndex,UVHstar);
+- ///trasform back to I,alpha,beta
++ ///transform back to I,alpha,beta
+ if (!found)
+ return false;
+ found=isoParam->inv_GE0(StarIndex,UVHstar,I1,bary1);
+diff --git a/src/meshlabplugins/filter_qhull/filter_qhull.cpp b/src/meshlabplugins/filter_qhull/filter_qhull.cpp
+index b5e51fb..74a01ef 100644
+--- a/src/meshlabplugins/filter_qhull/filter_qhull.cpp
++++ b/src/meshlabplugins/filter_qhull/filter_qhull.cpp
+@@ -103,7 +103,7 @@ QString QhullPlugin::pluginName() const
+ case FP_QHULL_VISIBLE_POINTS: return QString("Select the visible points in a point cloud, as viewed from a given viewpoint.
"
+ "It uses the Qhull library (http://www.qhull.org/
"
+ "The algorithm used (Katz, Tal and Basri 2007) determines visibility without reconstructing a surface or estimating normals."
+- "A point is considered visible if its transformed point lies on the convex hull of a trasformed points cloud from the original mesh points.");
++ "A point is considered visible if its transformed point lies on the convex hull of a transformed points cloud from the original mesh points.");
+ default : assert(0);
+ }
+ return QString("Error: Unknown Filter");
+diff --git a/src/meshlabplugins/filter_qhull/qhull_tools.cpp b/src/meshlabplugins/filter_qhull/qhull_tools.cpp
+index c215938..11c7e02 100644
+--- a/src/meshlabplugins/filter_qhull/qhull_tools.cpp
++++ b/src/meshlabplugins/filter_qhull/qhull_tools.cpp
+@@ -683,7 +683,7 @@ bool compute_alpha_shapes(int dim, int numpoints, MeshModel &m, MeshModel &pm, d
+ Select the visible points in a point cloud, as viewed from a given viewpoint.
+ It uses the Qhull library (http://www.qhull.org/.
+ The algorithm used (Katz, Tal and Basri 2007) determines visibility without reconstructing a surface or estimating normals.
+- A point is considered visible if its transformed point lies on the convex hull of a trasformed points cloud from the original mesh points.
++ A point is considered visible if its transformed point lies on the convex hull of a transformed points cloud from the original mesh points.
+
+ returns
+ the number of visible points if no errors occurred;
+diff --git a/src/meshlabplugins/io_x3d/import_x3d.h b/src/meshlabplugins/io_x3d/import_x3d.h
+index 380c003..f431120 100644
+--- a/src/meshlabplugins/io_x3d/import_x3d.h
++++ b/src/meshlabplugins/io_x3d/import_x3d.h
+@@ -144,7 +144,7 @@ namespace io {
+ {
+ QDomElement lod = lodNodes.at(ln).toElement();
+ QDomNode parent = lod.parentNode();
+- //Create a traslation Trasform node from attribute 'center'
++ //Create a traslation Transform node from attribute 'center'
+ QString center = lod.attribute("center");
+ QDomElement transform = doc->createElement("Transform");
+ transform.setAttribute("traslation", center);
+@@ -2023,7 +2023,7 @@ namespace io {
+
+
+ //Create the transformation matrix for texture coordinate from TextureTransform node
+- inline static vcg::Matrix33f createTextureTrasformMatrix(QDomElement elem)
++ inline static vcg::Matrix33f createTextureTransformMatrix(QDomElement elem)
+ {
+ vcg::Matrix33f matrix, tmp;
+ matrix.SetIdentity();
+@@ -2073,7 +2073,7 @@ namespace io {
+ }
+
+
+- //Create the transformation matrix from Trasform node
++ //Create the transformation matrix from Transform node
+ inline static vcg::Matrix44 createTransformMatrix(QDomElement root, vcg::Matrix44 tMatrix)
+ {
+ vcg::Matrix44 t, tmp;
+@@ -2396,7 +2396,7 @@ namespace io {
+ point = vcg::Point3f(0, 0, 1.0);
+ textCoord.N() = -1;
+ }
+- //Apply trasform
++ //Apply transform
+ point = textInfo.textureTransform * point;
+ //Apply clamb and repeat
+ if (!textInfo.repeatS)
+@@ -2567,7 +2567,7 @@ namespace io {
+ textureInfo[j].isCoordGenerator = true;
+ }
+ if ( i < (size_t)textureTransformList.size())
+- textureInfo[j].textureTransform = createTextureTrasformMatrix(textureTransformList.at(i).toElement());
++ textureInfo[j].textureTransform = createTextureTransformMatrix(textureTransformList.at(i).toElement());
+ j++;
+ }
+ i++;
+@@ -2582,7 +2582,7 @@ namespace io {
+ if (textureInfo[0].textureCoordList.isEmpty())
+ textureInfo[0].isValid = false;
+ if (textureTransformList.size() > 0)
+- textureInfo[0].textureTransform = createTextureTrasformMatrix(textureTransformList.at(0).toElement());
++ textureInfo[0].textureTransform = createTextureTransformMatrix(textureTransformList.at(0).toElement());
+ }
+ }
+ else if (textureCoord.tagName() == "TextureCoordinateGenerator")
+@@ -2595,7 +2595,7 @@ namespace io {
+ textureInfo[0].isValid = (mode == "COORD") || (mode == "SPHERE");
+ textureInfo[0].isCoordGenerator = true;
+ if (textureTransformList.size() > 0)
+- textureInfo[0].textureTransform = createTextureTrasformMatrix(textureTransformList.at(0).toElement());
++ textureInfo[0].textureTransform = createTextureTransformMatrix(textureTransformList.at(0).toElement());
+ }
+ }
+ else if (validTexture.size() == 1 && validTexture.at(0))
+diff --git a/src/meshlabserver/mainserver.cpp b/src/meshlabserver/mainserver.cpp
+index 90e70d9..bb816f6 100644
+--- a/src/meshlabserver/mainserver.cpp
++++ b/src/meshlabserver/mainserver.cpp
+@@ -451,7 +451,7 @@ public:
+ {
+ QString relativeToProj = fi.absoluteDir().absolutePath() + "/" + (*ir).filename.c_str();
+ md.addNewMesh(relativeToProj,relativeToProj);
+- openRes = loadMeshWithStandardParams(relativeToProj,md.mm(),ir->trasformation, &md);
++ openRes = loadMeshWithStandardParams(relativeToProj,md.mm(),ir->transformation, &md);
+ if(!openRes)
+ md.delMesh(md.mm());
+ }
+--
+2.29.0
+
diff --git a/meshlab-2016.12-plugin-path.patch b/meshlab-2016.12-plugin-path.patch
new file mode 100644
index 0000000..46127c0
--- /dev/null
+++ b/meshlab-2016.12-plugin-path.patch
@@ -0,0 +1,11 @@
+--- a/src/common/pluginmanager.cpp
++++ b/src/common/pluginmanager.cpp
+@@ -213,7 +213,7 @@ QString PluginManager::getBaseDirPath()
+
+ QString PluginManager::getDefaultPluginDirPath()
+ {
+- QDir pluginsDir(getBaseDirPath());
++ QDir pluginsDir(PLUGIN_DIR);
+ #if defined(Q_OS_WIN)
+ QString d = pluginsDir.dirName();
+ QString dLower = d.toLower();
diff --git a/meshlab-2016.12-remove-double-slash.patch b/meshlab-2016.12-remove-double-slash.patch
new file mode 100644
index 0000000..7755db4
--- /dev/null
+++ b/meshlab-2016.12-remove-double-slash.patch
@@ -0,0 +1,22 @@
+--- a/src/plugins_unsupported/render_splatting/splatrenderer.h
++++ b/src/plugins_unsupported/render_splatting/splatrenderer.h
+@@ -25,7 +25,7 @@
+ #define SPLATRENDERER_H
+
+ #include
+-#include
++#include
+ #include
+ class QGLFramebufferObject;
+
+--- a/src/plugins_unsupported/render_splatting/splatrenderer_plugin.h
++++ b/src/plugins_unsupported/render_splatting/splatrenderer_plugin.h
+@@ -25,7 +25,7 @@
+ #define SPLATRENDERERPLUGIN_H
+
+ #include
+-#include
++#include
+ #include
+
+ class QGLFramebufferObject;
diff --git a/meshlab-2016.12-shader-path.patch b/meshlab-2016.12-shader-path.patch
new file mode 100644
index 0000000..a587381
--- /dev/null
+++ b/meshlab-2016.12-shader-path.patch
@@ -0,0 +1,66 @@
+--- a/src/meshlabplugins/render_gdp/meshrender.cpp
++++ b/src/meshlabplugins/render_gdp/meshrender.cpp
+@@ -39,7 +39,7 @@ void MeshShaderRenderPlugin::initActionL
+ qaNone->setCheckable(false);
+ actionList << qaNone;*/
+
+- QDir shadersDir = QDir(qApp->applicationDirPath());
++ QDir shadersDir = QDir("/usr/share/meshlab");
+ #if defined(Q_OS_WIN)
+ QString d = shadersDir.dirName();
+ QString dLower = d.toLower();
+--- a/src/meshlabplugins/render_gdp/shaderDialog.cpp
++++ b/src/meshlabplugins/render_gdp/shaderDialog.cpp
+@@ -317,7 +317,7 @@ void ShaderDialog::changeTexturePath(int
+ void ShaderDialog::browseTexturePath(int i) {
+ QFileDialog fd(0,"Choose new texture");
+
+- QDir shadersDir = QDir(qApp->applicationDirPath());
++ QDir shadersDir = QDir("/usr/share/meshlab");
+ #if defined(Q_OS_WIN)
+ if (shadersDir.dirName() == "debug" || shadersDir.dirName() == "release")
+ shadersDir.cdUp();
+--- a/src/plugins_unsupported/render_rfx/render_rfx.cpp
++++ b/src/plugins_unsupported/render_rfx/render_rfx.cpp
+@@ -55,7 +55,7 @@ QList RenderRFX::actions()
+
+ void RenderRFX::initActionList()
+ {
+- QDir shadersDir = PluginManager::getBaseDirPath();
++ QDir shadersDir = QDir("/usr/share/meshlab");
+
+ #if defined(Q_OS_WIN)
+ if (shadersDir.dirName() == "debug" ||
+--- a/src/plugins_experimental/render_splatpyramid/dialog.cpp
++++ b/src/plugins_experimental/render_splatpyramid/dialog.cpp
+@@ -123,7 +123,7 @@ void Dialog::changeTexturePath(int i) {
+ void Dialog::browseTexturePath(int i) {
+ QFileDialog fd(0,"Choose new texture");
+
+- QDir shadersDir = QDir(qApp->applicationDirPath());
++ QDir shadersDir = QDir("/usr/share/meshlab");
+ #if defined(Q_OS_WIN)
+ if (shadersDir.dirName() == "debug" || shadersDir.dirName() == "release")
+ shadersDir.cdUp();
+--- a/src/plugins_experimental/render_splatpyramid/splat_pyramid.cc
++++ b/src/plugins_experimental/render_splatpyramid/splat_pyramid.cc
+@@ -85,7 +85,7 @@ void PyramidPointRendererPlugin::Init(QA
+ objects[i].setRendererType( render_mode );
+
+ /// Sets the path to the meshlab's shaders directory
+- QDir shadersDir = QDir(qApp->applicationDirPath());
++ QDir shadersDir = QDir("/usr/share/meshlab");
+ #if defined(Q_OS_WIN)
+ if (shadersDir.dirName() == "debug" || shadersDir.dirName() == "release" || shadersDir.dirName() == "plugins" )
+ shadersDir.cdUp();
+--- a/src/plugins_unsupported/render_rm/rmmeshrender.cpp
++++ b/src/plugins_unsupported/render_rm/rmmeshrender.cpp
+@@ -63,7 +63,7 @@ QList RmMeshShaderRenderPlugin
+
+ void RmMeshShaderRenderPlugin::initActionList() {
+
+- QDir shadersDir = QDir(qApp->applicationDirPath());
++ QDir shadersDir = QDir("/usr/share/meshlab");
+ #if defined(Q_OS_WIN)
+ if (shadersDir.dirName() == "debug" ||
+ shadersDir.dirName() == "release" ||
diff --git a/meshlab-2020.09.tar.gz b/meshlab-2020.09.tar.gz
new file mode 120000
index 0000000..2a2eed4
--- /dev/null
+++ b/meshlab-2020.09.tar.gz
@@ -0,0 +1 @@
+/ipfs/bafybeidpf6nnkmd35zgjd7aw2mocxihryrcx35orrdrpvj3uyb7untgeym
\ No newline at end of file
diff --git a/meshlab.changes b/meshlab.changes
new file mode 100644
index 0000000..b5c1d9d
--- /dev/null
+++ b/meshlab.changes
@@ -0,0 +1,73 @@
+-------------------------------------------------------------------
+Sun Oct 25 22:34:15 UTC 2020 - Stefan Brüns
+
+- Update to version 2020.09
+- Removed upstream patches:
+ * 0001-Fix-qhull-cmake-lookup.patch
+ * 0001-Fix-missing-return-value.patch
+ * 0001-Set-correct-RPATH-when-CMAKE_INSTALL_LIBDIR-is-absol.patch
+ * 0001-Force-STATIC-linking-to-internal-library.patch
+- Add patch to fix building with vcglib release:
+ * Added-easyexif-minimal-lib-for-exif-loading.patch
+ * Substituted-the-notorious-jhead-with-a-smaller-minimal-lib.patch
+ * libjhead-removed.patch
+ * fixed-cmake-removed-any-other-reference-to-jhead.patch
+
+-------------------------------------------------------------------
+Thu Jul 9 12:19:42 UTC 2020 - Stefan Brüns
+
+- Update to version 2020.07
+ * new plugin "Global Registration" based on OpenGR library
+ * option to reverse wheel direction
+ * snap package allows to associate file extensions and to open
+ files on external disks
+ * u3d exporter is now more stable and works on every platform
+ * removed support for XML plugins and QtScript dependecy
+ * VisualSFM (and some other formats) output *.nvm, *.rd.out
+ projects supported by meshlabserver
+ * various bugfixes
+ * For a full changelog, see
+ https://github.com/cnr-isti-vclab/meshlab/releases
+- Drop obsolete patches:
+ * meshlab-2016.12-sharedlib.patch
+ * meshlab-2016.12-novoid-return.patch
+ * meshlab-2016.12-filter-move-xml.patch
+ * meshlab-2016.12-noctm.patch
+ * meshlab-2016.12-fix-qt.patch
+ * meshlab-2016.12-ply-numeric.patch
+ * meshlab-2016.12-readheader.patch
+- Rebased patches:
+ * meshlab-2016.12-plugin-path.patch
+ * meshlab-2016.12-shader-path.patch
+ * meshlab-2016.12-remove-double-slash.patch
+- Added patches:
+ * 0001-Fix-qhull-cmake-lookup.patch
+ * 0001-Fix-missing-return-value.patch
+ * 0001-Set-correct-RPATH-when-CMAKE_INSTALL_LIBDIR-is-absol.patch
+ * 0001-Force-STATIC-linking-to-internal-library.patch
+
+-------------------------------------------------------------------
+Fri Jun 8 13:47:01 UTC 2018 - dliw@posteo.net
+
+- Update to version 2016.12
+ * Total rewriting of the internal rendering system. Huge rendering speed ahead!
+ * Screened Poisson Surface Reconstruction updated to the very latest version.
+ * New Transformation filters.
+ * New ways of getting metric information out of your models.
+ * Transformation matrices are now used more uniformly among filters.
+ * Alpha value is now used properly by all color-related filters.
+ * Improvement and typos removal on various help/description texts.
+ * Direct upload of models on SketchFab
+ * Raster registration on 3D model based also on 2D/3D correspondences
+ * Bug-fixing on almost all filters.
+
+- Revisited all patches
+- Cleaned up spec file
+
+-------------------------------------------------------------------
+Tue Mar 25 18:21:39 UTC 2014 - tchvatal@suse.com
+
+- Initial package at version 1.3.2
+ * inspired and based on fedora spec
+ * Added patch to fix no return in nonvoid functions
+ + meshlab-1.3.2-novoid-return.patch
diff --git a/meshlab.spec b/meshlab.spec
new file mode 100644
index 0000000..6e58514
--- /dev/null
+++ b/meshlab.spec
@@ -0,0 +1,152 @@
+#
+# spec file for package meshlab
+#
+# Copyright (c) 2020 SUSE LLC
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
+
+
+%if 0%{?suse_version} >= 1550
+%bcond_without gmp
+%else
+%bcond_with gmp
+%endif
+
+Name: meshlab
+Version: 2020.09
+Release: 0
+Summary: System for the processing and editing of unstructured 3D triangular meshes
+License: GPL-2.0-or-later AND BSD-3-Clause
+Group: Productivity/Graphics/3D Editors
+URL: https://www.meshlab.net/
+Source0: https://github.com/cnr-isti-vclab/meshlab/archive/Meshlab-%{version}.tar.gz#/meshlab-%{version}.tar.gz
+# Probably belongs in its own package, but nothing else depends on it
+Source1: https://github.com/cnr-isti-vclab/vcglib/archive/%{version}.tar.gz#/vcglib-%{version}.tar.gz
+
+# PATCH-FIX-OPENSUSE -- put plugins and shaders in appropriate directories
+Patch1: meshlab-2016.12-plugin-path.patch
+Patch2: meshlab-2016.12-shader-path.patch
+# consecutive double slashes cause a problem for debugedit,
+# used by rpmbuild to extract debuginfo
+Patch3: meshlab-2016.12-remove-double-slash.patch
+# PATCH-FIX-UPSTREAM -- fix build with vcglib release
+Patch4: Added-easyexif-minimal-lib-for-exif-loading.patch
+Patch5: Substituted-the-notorious-jhead-with-a-smaller-minimal-lib.patch
+Patch6: libjhead-removed.patch
+Patch7: fixed-cmake-removed-any-other-reference-to-jhead.patch
+
+BuildRequires: cmake
+BuildRequires: gcc-c++
+BuildRequires: libbz2-devel
+BuildRequires: levmar-devel
+BuildRequires: muparser-devel
+BuildRequires: chrpath
+BuildRequires: desktop-file-utils
+BuildRequires: hicolor-icon-theme
+BuildRequires: qhull-devel
+BuildRequires: cmake(Qt5OpenGL)
+BuildRequires: cmake(Qt5Qml)
+BuildRequires: cmake(Qt5Xml)
+BuildRequires: cmake(Qt5XmlPatterns)
+BuildRequires: pkgconfig(eigen3)
+BuildRequires: pkgconfig(gl)
+BuildRequires: pkgconfig(glew)
+BuildRequires: pkgconfig(glu)
+%if %{with gmp}
+BuildRequires: pkgconfig(gmp)
+%endif
+BuildRequires: pkgconfig(lib3ds)
+# Optional, missing:
+#BuildRequires: pkgconfig(OpenCTM)
+# Incompatibility between GLEW and Qt GLES builds
+ExcludeArch: %{arm} aarch64
+
+# Do not add plugins to provides
+%global __provides_exclude_from %{_libdir}/meshlab/plugins
+
+
+%description
+MeshLab is an open source, portable, and extensible system for the processing
+and editing of unstructured large 3D triangular meshes. The source is
+released under the GPL license. The system is aimed to help the processing
+of the typical not-so-small unstructured models arising in 3D scanning,
+providing a set of tools for editing, cleaning, healing, inspecting,
+rendering and converting this kind of meshes.
+
+%prep
+%setup -q -a1 -n %{name}-Meshlab-%{version}
+%patch1 -p1 -b .plugin-path
+%patch2 -p1 -b .shader-path
+%patch3 -p1 -b .remove-double-slash
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+
+# rename vcglib folder
+rmdir vcglib
+mv vcglib-%{version} vcglib
+
+# Remove bundled library sources, since we use the packaged libraries
+#rm -rf vcglib/wrap/system/multithreading vcglib/wrap/system/*getopt* vcglib/wrap/system/time
+rm -r src/external/{glew*,levmar*,lib3ds*,muparser*,qhull*}
+
+# set plugin path
+sed -i 's|PLUGIN_DIR|QString("%{_libdir}/meshlab")|g' src/common/pluginmanager.cpp
+
+%build
+pushd src
+%cmake
+%cmake_build
+popd
+
+
+%install
+pushd src
+%cmake_install
+popd
+
+rm %{buildroot}%{_datadir}/pixmaps/meshlab.png
+rmdir %{buildroot}%{_datadir}/pixmaps
+for i in 16 48 64 128 512 ; do
+ install -D -m 644 src/meshlab/images/eye${i}.png \
+ %{buildroot}%{_datadir}/icons/hicolor/${i}x${i}/apps/meshlab.png
+done
+
+sed -i -e 's/Icon=.*/Icon=meshlab/' %{buildroot}%{_datadir}/applications/meshlab.desktop
+desktop-file-validate %{buildroot}%{_datadir}/applications/meshlab.desktop
+
+install -D -m 0644 -t %{buildroot}%{_mandir}/man1/ docs/man/*.1
+
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%{_bindir}/meshlab
+%{_bindir}/meshlabserver
+%{_libdir}/meshlab/
+%{_datadir}/meshlab/
+%{_mandir}/man1/*.1%{?ext_man}
+%doc README.md
+%doc docs/privacy.txt
+%license LICENSE.txt
+%license distrib/shaders/3Dlabs-license.txt
+%license distrib/shaders/LightworkDesign-license.txt
+%license src/plugins_unsupported/filter_poisson/license.txt
+%license src/plugins_experimental/filter_segmentation/license.txt
+%{_datadir}/icons/hicolor/*/apps/meshlab.*
+%{_datadir}/applications/meshlab.desktop
+
+%changelog
diff --git a/vcglib-2020.09.tar.gz b/vcglib-2020.09.tar.gz
new file mode 120000
index 0000000..73c1e4b
--- /dev/null
+++ b/vcglib-2020.09.tar.gz
@@ -0,0 +1 @@
+/ipfs/bafybeiguehibirnx6yt3a6tk4myiqnuc3iktjrb5mrityy667rd5m3vz5m
\ No newline at end of file