diff --git a/README.md b/README.md
index e9a9d38d..554e4fca 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
+# SolveSpace
+
-SolveSpace
-==========
[![Build Status](https://github.com/solvespace/solvespace/workflows/CD/badge.svg)](https://github.com/solvespace/solvespace/actions)
[![solvespace](https://snapcraft.io/solvespace/badge.svg)](https://snapcraft.io/solvespace)
[![solvespace](https://snapcraft.io/solvespace/trending.svg?name=0)](https://snapcraft.io/solvespace)
@@ -9,29 +9,27 @@ SolveSpace
This repository contains the source code of [SolveSpace][], a parametric
2d/3d CAD.
-[solvespace]: http://solvespace.com
+[solvespace]: https://solvespace.com
-Community
----------
+## Community
The official SolveSpace [website][sswebsite] has [tutorials][sstutorial],
[reference manual][ssref] and a [forum][ssforum]; there is also an official
-IRC channel [#solvespace at irc.freenode.net][ssirc].
+IRC channel [#solvespace at web.libera.chat][ssirc].
[sswebsite]: http://solvespace.com/
[ssref]: http://solvespace.com/ref.pl
[sstutorial]: http://solvespace.com/tutorial.pl
[ssforum]: http://solvespace.com/forum.pl
-[ssirc]: https://webchat.freenode.net/?channels=solvespace
+[ssirc]: https://web.libera.chat/#solvespace
-Installation
-------------
+## Installation
### Via official binary packages
-_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows (>=Vista 32-bit) are
-available via [GitHub releases][rel]. These packages are automatically built by
-the SolveSpace maintainers for each stable release.
+_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows
+(>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are
+automatically built by the SolveSpace maintainers for each stable release.
[rel]: https://github.com/solvespace/solvespace/releases
@@ -39,151 +37,177 @@ the SolveSpace maintainers for each stable release.
Official releases can be installed from the `stable` channel.
-Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds.
+Builds from master are automatically released to the `edge` channel in the Snap
+Store. Those packages contain the latest improvements, but receive less testing
+than release builds.
[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/solvespace)
Or install from a terminal:
-```
+```sh
# for the latest stable release:
-snap install solvespace
+snap install solvespace
+
# for the bleeding edge builds from master:
snap install solvespace --edge
```
### Via third-party binary packages
-_Third-party_ nightly binary packages for Debian and Ubuntu are available
-via [notesalexp.org][notesalexp]. These packages are automatically built from non-released
-source code. The SolveSpace maintainers do not control the contents of these packages
-and cannot guarantee their functionality.
+_Third-party_ nightly binary packages for Debian and Ubuntu are available via
+[notesalexp.org][notesalexp]. These packages are automatically built from
+non-released source code. The SolveSpace maintainers do not control the contents
+of these packages and cannot guarantee their functionality.
[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/
### Via automated edge builds
-> :warning: **Edge builds might be unstable or contain severe bugs!**
+> :warning: **Edge builds might be unstable or contain severe bugs!**
> They are intended for experienced users to test new features or verify bugfixes.
-Cutting edge builds from the latest master commit are available as zip archives from the
-following links:
+Cutting edge builds from the latest master commit are available as zip archives
+from the following links:
- [macOS](https://nightly.link/solvespace/solvespace/workflows/cd/master/macos.zip)
- [Windows](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows.zip)
- [Windows with OpenMP enabled](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows-openmp.zip)
-Extract the downloaded archive and install or execute the contained file as is appropriate for your platform.
+Extract the downloaded archive and install or execute the contained file as is
+appropriate for your platform.
### Via source code
See below.
-Building on Linux
------------------
+## Building on Linux
### Building for Linux
-You will need the usual build tools, CMake, zlib, libpng, cairo, freetype.
-To build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later), pangomm 1.4,
-OpenGL and OpenGL GLU, and optionally, the Space Navigator client library.
-On a Debian derivative (e.g. Ubuntu) these can be installed with:
+You will need the usual build tools, CMake, zlib, libpng, cairo, freetype. To
+build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later),
+pangomm 1.4, OpenGL and OpenGL GLU, and optionally, the Space Navigator client
+library. On a Debian derivative (e.g. Ubuntu) these can be installed with:
- sudo apt install git build-essential cmake zlib1g-dev libpng-dev \
- libcairo2-dev libfreetype6-dev libjson-c-dev \
- libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \
- libgl-dev libglu-dev libspnav-dev
+```sh
+sudo apt install git build-essential cmake zlib1g-dev libpng-dev \
+ libcairo2-dev libfreetype6-dev libjson-c-dev \
+ libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \
+ libgl-dev libglu-dev libspnav-dev
+```
-On a Redhat derivative (e.g. Fedora) the dependencies can be installed with:
+On a RedHat derivative (e.g. Fedora) the dependencies can be installed with:
- sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \
- cairo-devel freetype-devel json-c-devel \
- fontconfig-devel gtkmm30-devel pangomm-devel \
- mesa-libGL-devel mesa-libGLU-devel libspnav-devel
+```sh
+sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \
+ cairo-devel freetype-devel json-c-devel \
+ fontconfig-devel gtkmm30-devel pangomm-devel \
+ mesa-libGL-devel mesa-libGLU-devel libspnav-devel
+```
Before building, check out the project and the necessary submodules:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init extlib/libdxfrw extlib/mimalloc
+```sh
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init extlib/libdxfrw extlib/mimalloc
+```
After that, build SolveSpace as following:
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON
- make
- sudo make install
+```sh
+mkdir build
+cd build
+cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON
+make
-Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the
+# Optionally
+sudo make install
+```
+
+Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the
expense of longer build time.
-The graphical interface is built as `build/bin/solvespace`, and the command-line interface
-is built as `build/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation.
+The graphical interface is built as `build/bin/solvespace`, and the command-line
+interface is built as `build/bin/solvespace-cli`. It is possible to build only
+the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake
+invocation.
### Building for Windows
-Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed to work.
+Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed
+to work.
-You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with:
+You will need the usual build tools, CMake, and a Windows cross-compiler. On a
+Debian derivative (e.g. Ubuntu) these can be installed with:
- apt-get install git build-essential cmake mingw-w64
+```sh
+apt-get install git build-essential cmake mingw-w64
+```
Before building, check out the project and the necessary submodules:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init
+```sh
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init
+```
Build 64-bit SolveSpace with the following:
- mkdir build
- cd build
- cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \
- -DCMAKE_BUILD_TYPE=Release \
- -DFLATC=$(which flatc)
- make
+```sh
+mkdir build
+cd build
+cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \
+ -DCMAKE_BUILD_TYPE=Release
+make
+```
-The graphical interface is built as `build/bin/solvespace.exe`, and the command-line interface
-is built as `build/bin/solvespace-cli.exe`.
+The graphical interface is built as `build/bin/solvespace.exe`, and the
+command-line interface is built as `build/bin/solvespace-cli.exe`.
Space Navigator support will not be available.
-If using Ubuntu to cross-compile, Ubuntu 17.10 or newer (or, alternatively, MinGW from the Ubuntu
-17.10 repositories) is required.
-
-Building on macOS
------------------
+## Building on macOS
You will need git, XCode tools and CMake. Git and CMake can be installed
via [Homebrew][]:
- brew install git cmake
+```sh
+brew install git cmake
+```
XCode has to be installed via AppStore or [the Apple website][appledeveloper];
it requires a free Apple ID.
Before building, check out the project and the necessary submodules:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init
+```sh
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init
+```
After that, build SolveSpace as following:
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON
- make
+```sh
+mkdir build
+cd build
+cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON
+make
+```
-Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the
+Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the
expense of longer build time.
Alternatively, generate an XCode project, open it, and build the "Release" scheme:
- mkdir build
- cd build
- cmake .. -G Xcode
+```sh
+mkdir build
+cd build
+cmake .. -G Xcode
+```
The application is built in `build/bin/SolveSpace.app`, the graphical interface executable
is `build/bin/SolveSpace.app/Contents/MacOS/SolveSpace`, and the command-line interface executable
@@ -192,26 +216,32 @@ is `build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli`.
[homebrew]: https://brew.sh/
[appledeveloper]: https://developer.apple.com/download/
-Building on OpenBSD
--------------------
+## Building on OpenBSD
You will need git, cmake, libexecinfo, libpng, gtk3mm and pangomm.
These can be installed from the ports tree:
- pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm
+```sh
+pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm
+```
Before building, check out the project and the necessary submodules:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init extlib/libdxfrw extlib/mimalloc
+```sh
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init extlib/libdxfrw extlib/mimalloc
+```
After that, build SolveSpace as following:
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=Release
- make
+```sh
+mkdir build
+cd build
+cmake .. -DCMAKE_BUILD_TYPE=Release
+make
+sudo make install
+```
Unfortunately, on OpenBSD, the produced executables are not filesystem location independent
and must be installed before use. By default, the graphical interface is installed to
@@ -219,8 +249,7 @@ and must be installed before use. By default, the graphical interface is install
`/usr/local/bin/solvespace-cli`. It is possible to build only the command-line interface
by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation.
-Building on Windows
--------------------
+## Building on Windows
You will need [git][gitwin], [cmake][cmakewin] and a C++ compiler
(either Visual C++ or MinGW). If using Visual C++, Visual Studio 2015
@@ -235,17 +264,19 @@ Visual C++ and build it.
### Building with Visual Studio in a command prompt
-First, ensure that git and cl (the Visual C++ compiler driver) are in your
+First, ensure that `git` and `cl` (the Visual C++ compiler driver) are in your
`%PATH%`; the latter is usually done by invoking `vcvarsall.bat` from your
Visual Studio install. Then, run the following in cmd or PowerShell:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init
- mkdir build
- cd build
- cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
- nmake
+```bat
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init
+mkdir build
+cd build
+cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
+nmake
+```
### Building with MinGW
@@ -255,25 +286,25 @@ Space Navigator support will be disabled.
First, ensure that git and gcc are in your `$PATH`. Then, run the following
in bash:
- git clone https://github.com/solvespace/solvespace
- cd solvespace
- git submodule update --init
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=Release
- make
+```sh
+git clone https://github.com/solvespace/solvespace
+cd solvespace
+git submodule update --init
+mkdir build
+cd build
+cmake .. -DCMAKE_BUILD_TYPE=Release
+make
+```
[gitwin]: https://git-scm.com/download/win
[cmakewin]: http://www.cmake.org/download/#latest
[mingw]: http://www.mingw.org/
-Contributing
-------------
+## Contributing
See the [guide for contributors](CONTRIBUTING.md) for the best way to file issues, contribute code,
and debug SolveSpace.
-License
--------
+## License
SolveSpace is distributed under the terms of the [GPL v3](COPYING.txt) or later.
diff --git a/src/importidf.cpp b/src/importidf.cpp
index 8ca3432a..3cd501c8 100644
--- a/src/importidf.cpp
+++ b/src/importidf.cpp
@@ -332,8 +332,9 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s
double board_thickness = 10.0;
double scale = 1.0; //mm
- bool topEntities, bottomEntities;
-
+ bool topEntities = false;
+ bool bottomEntities = false;
+
Quaternion normal = Quaternion::From(Vector::From(1,0,0), Vector::From(0,1,0));
hEntity hnorm = newNormal(el, &entityCount, normal);
diff --git a/src/platform/gui.h b/src/platform/gui.h
index 1608a6f2..f63fa80b 100644
--- a/src/platform/gui.h
+++ b/src/platform/gui.h
@@ -7,6 +7,7 @@
#ifndef SOLVESPACE_GUI_H
#define SOLVESPACE_GUI_H
+namespace SolveSpace {
class RgbaColor;
namespace Platform {
@@ -386,5 +387,6 @@ void ExitGui();
void ClearGui();
}
+} // namespace SolveSpace
#endif
diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm
index 67d1eb97..91a197d3 100644
--- a/src/platform/guimac.mm
+++ b/src/platform/guimac.mm
@@ -372,6 +372,7 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
double rotationGestureCurrent;
Point2d trackpadPositionShift;
bool inTrackpadScrollGesture;
+ int numTouches;
Platform::Window::Kind kind;
}
@@ -397,6 +398,8 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
editor.action = @selector(didEdit:);
inTrackpadScrollGesture = false;
+ numTouches = 0;
+ self.acceptsTouchEvents = YES;
kind = aKind;
if(kind == Platform::Window::Kind::TOPLEVEL) {
NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self
@@ -573,7 +576,9 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
using Platform::MouseEvent;
MouseEvent event = [self convertMouseEvent:nsEvent];
- if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) {
+ // Check for number of touches to exclude single-finger scrolling on Magic Mouse
+ bool isTrackpadEvent = numTouches >= 2 && nsEvent.subtype == NSEventSubtypeTabletPoint;
+ if(isTrackpadEvent && kind == Platform::Window::Kind::TOPLEVEL) {
// This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via
// NSPanGestureRecognizer which is how you might expect this to work... We complicate this
// further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using
@@ -626,6 +631,23 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
receiver->onMouseEvent(event);
}
+- (void)touchesBeganWithEvent:(NSEvent *)event {
+ numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count;
+ [super touchesBeganWithEvent:event];
+}
+- (void)touchesMovedWithEvent:(NSEvent *)event {
+ numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count;
+ [super touchesMovedWithEvent:event];
+}
+- (void)touchesEndedWithEvent:(NSEvent *)event {
+ numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count;
+ [super touchesEndedWithEvent:event];
+}
+- (void)touchesCancelledWithEvent:(NSEvent *)event {
+ numTouches = 0;
+ [super touchesCancelledWithEvent:event];
+}
+
- (void)mouseExited:(NSEvent *)nsEvent {
using Platform::MouseEvent;
diff --git a/src/platform/platform.h b/src/platform/platform.h
index 21c2b2bf..1ad5e175 100644
--- a/src/platform/platform.h
+++ b/src/platform/platform.h
@@ -7,6 +7,7 @@
#ifndef SOLVESPACE_PLATFORM_H
#define SOLVESPACE_PLATFORM_H
+namespace SolveSpace {
namespace Platform {
// UTF-8 ⟷ UTF-16 conversion, for Windows.
@@ -80,6 +81,7 @@ void DebugPrint(const char *fmt, ...);
void *AllocTemporary(size_t size);
void FreeAllTemporary();
-}
+} // namespace Platform
+} // namespace SolveSpace
#endif
diff --git a/src/resource.cpp b/src/resource.cpp
index 7b19081e..258c73a4 100644
--- a/src/resource.cpp
+++ b/src/resource.cpp
@@ -564,7 +564,7 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) {
// Find the hex representation in the (sorted) Unifont file.
auto first = unifontData.cbegin(),
last = unifontData.cend();
- while(first <= last) {
+ while(first < last) {
auto mid = first + (last - first) / 2;
while(mid != unifontData.cbegin()) {
if(*mid == '\n') {
@@ -588,7 +588,10 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) {
if(foundCodepoint < codepoint) {
first = mid + 1;
while(first != unifontData.cend()) {
- if(*first == '\n') break;
+ if(*first == '\n') {
+ first++;
+ break;
+ }
first++;
}
continue; // and last stays the same
diff --git a/src/resource.h b/src/resource.h
index 18c1e582..d5c2e3f0 100644
--- a/src/resource.h
+++ b/src/resource.h
@@ -7,11 +7,23 @@
#ifndef SOLVESPACE_RESOURCE_H
#define SOLVESPACE_RESOURCE_H
+#include
+#include