Merge from master.
commit
40c1541df5
27
.travis.yml
27
.travis.yml
|
@ -26,6 +26,33 @@ jobs:
|
||||||
on:
|
on:
|
||||||
repo: solvespace/solvespace
|
repo: solvespace/solvespace
|
||||||
tags: true
|
tags: true
|
||||||
|
- &deploy-snap
|
||||||
|
stage: deploy
|
||||||
|
name: Snap amd64
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
dist: bionic
|
||||||
|
addons:
|
||||||
|
snaps:
|
||||||
|
- name: snapcraft
|
||||||
|
confinement: classic
|
||||||
|
script: ./.travis/build-snap.sh
|
||||||
|
deploy:
|
||||||
|
- provider: script
|
||||||
|
script: sudo ./.travis/deploy-snap.sh edge
|
||||||
|
skip_cleanup: true
|
||||||
|
on:
|
||||||
|
branch: master
|
||||||
|
tags: false
|
||||||
|
- provider: script
|
||||||
|
script: sudo ./.travis/deploy-snap.sh edge,beta
|
||||||
|
skip_cleanup: true
|
||||||
|
on:
|
||||||
|
branch: master
|
||||||
|
tags: true
|
||||||
|
- <<: *deploy-snap
|
||||||
|
name: Snap arm64
|
||||||
|
arch: arm64
|
||||||
- &linux
|
- &linux
|
||||||
stage: deploy
|
stage: deploy
|
||||||
os: linux
|
os: linux
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh -xe
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo ./pkg/snap/build.sh --destructive-mode
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
channels="$1"
|
||||||
|
echo "$SNAP_TOKEN" | snapcraft login --with -
|
||||||
|
|
||||||
|
for snap in ./pkg/snap/*.snap; do
|
||||||
|
snapcraft push "$snap" --release "$channels"
|
||||||
|
done
|
|
@ -7,8 +7,10 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||||
" mkdir build && cd build && cmake ..")
|
" mkdir build && cd build && cmake ..")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.2.0 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR)
|
||||||
cmake_policy(VERSION 3.11)
|
if(NOT CMAKE_VERSION VERSION_LESS 3.11.0)
|
||||||
|
cmake_policy(VERSION 3.11.0)
|
||||||
|
endif()
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
|
||||||
"${CMAKE_SOURCE_DIR}/cmake/")
|
"${CMAKE_SOURCE_DIR}/cmake/")
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
14
README.md
14
README.md
|
@ -30,6 +30,20 @@ the SolveSpace maintainers for each stable release.
|
||||||
|
|
||||||
[rel]: https://github.com/solvespace/solvespace/releases
|
[rel]: https://github.com/solvespace/solvespace/releases
|
||||||
|
|
||||||
|
### Via Snap Store
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Future official releases will appear in the `stable` channel.
|
||||||
|
|
||||||
|
[![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:
|
||||||
|
|
||||||
|
```
|
||||||
|
snap install --edge solvespace
|
||||||
|
```
|
||||||
|
|
||||||
### Via third-party binary packages
|
### Via third-party binary packages
|
||||||
|
|
||||||
_Third-party_ nightly binary packages for Debian and Ubuntu are available
|
_Third-party_ nightly binary packages for Debian and Ubuntu are available
|
||||||
|
|
|
@ -26,9 +26,10 @@ apps:
|
||||||
extensions: [gnome-3-28]
|
extensions: [gnome-3-28]
|
||||||
plugs: [opengl, unity7, home, removable-media, gsettings, network]
|
plugs: [opengl, unity7, home, removable-media, gsettings, network]
|
||||||
environment:
|
environment:
|
||||||
__EGL_VENDOR_LIBRARY_DIRS: $SNAP/usr/share/glvnd/egl_vendor.d
|
__EGL_VENDOR_LIBRARY_DIRS: $SNAP/gnome-platform/usr/share/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d
|
||||||
cli:
|
cli:
|
||||||
command: usr/bin/solvespace-cli
|
command: usr/bin/solvespace-cli
|
||||||
|
extensions: [gnome-3-28]
|
||||||
plugs: [home, removable-media, network]
|
plugs: [home, removable-media, network]
|
||||||
|
|
||||||
parts:
|
parts:
|
||||||
|
@ -71,6 +72,14 @@ parts:
|
||||||
- libglibmm-2.4-1v5
|
- libglibmm-2.4-1v5
|
||||||
- libpangomm-1.4-1v5
|
- libpangomm-1.4-1v5
|
||||||
- libsigc++-2.0-0v5
|
- libsigc++-2.0-0v5
|
||||||
- libglew2.0
|
cleanup:
|
||||||
- libegl-mesa0
|
after: [solvespace]
|
||||||
- libdrm2
|
plugin: nil
|
||||||
|
build-snaps: [core18, gnome-3-28-1804]
|
||||||
|
override-prime: |
|
||||||
|
# Remove all files from snap that are already included in the base snap or in
|
||||||
|
# any connected content snaps
|
||||||
|
set -eux
|
||||||
|
for snap in "core18" "gnome-3-28-1804"; do # List all content-snaps and base snaps you're using here
|
||||||
|
cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" \;
|
||||||
|
done
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<path d="m152 80h12v74h-12z" fill="#cbcbcb"/>
|
<path d="m152 80h12v74h-12z" fill="#cbcbcb"/>
|
||||||
<path d="m104 140h84v12h-84z" fill="#e40cf2"/>
|
<path d="m104 140h84v12h-84z" fill="#e40cf2"/>
|
||||||
<path d="m140 68h12v74h-12z" fill="#e40cf2"/>
|
<path d="m140 68h12v74h-12z" fill="#e40cf2"/>
|
||||||
<path d="m56 164h36v36h-36z" fill="#43f20c"/>
|
|
||||||
<path d="m68 32h12v192h-12z"/>
|
<path d="m68 32h12v192h-12z"/>
|
||||||
<path d="m32 176h192v12h-192z"/>
|
<path d="m32 176h192v12h-192z"/>
|
||||||
|
<path d="m56 164h36v36h-36z" fill="#43f20c"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 444 B After Width: | Height: | Size: 444 B |
|
@ -196,9 +196,6 @@ void Constraint::MenuConstrain(Command id) {
|
||||||
c.valA = 0;
|
c.valA = 0;
|
||||||
c.ModifyToSatisfy();
|
c.ModifyToSatisfy();
|
||||||
AddConstraint(&c);
|
AddConstraint(&c);
|
||||||
if (SS.immediatelyEditDimension) {
|
|
||||||
SS.GW.EditConstraint(c.h);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -610,9 +607,6 @@ void Constraint::MenuConstrain(Command id) {
|
||||||
|
|
||||||
c.ModifyToSatisfy();
|
c.ModifyToSatisfy();
|
||||||
AddConstraint(&c);
|
AddConstraint(&c);
|
||||||
if (SS.immediatelyEditDimension) {
|
|
||||||
SS.GW.EditConstraint(c.h);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,6 +763,10 @@ void Constraint::MenuConstrain(Command id) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((id == Command::DISTANCE_DIA || id == Command::ANGLE) && SS.immediatelyEditDimension) {
|
||||||
|
SS.GW.EditConstraint(c.h);
|
||||||
|
}
|
||||||
|
|
||||||
SS.GW.ClearSelection();
|
SS.GW.ClearSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -917,13 +917,13 @@ void SolveSpaceUI::ExportMeshAsQ3doTo(FILE *f, SMesh *sm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector faceNormal = t.Normal();
|
Vector faceNormal = t.Normal();
|
||||||
auto a = q3d::Vector3(t.a.x/s, t.a.y/s, t.a.z/s);
|
auto a = q3d::Vector3((float)(t.a.x/s), (float)(t.a.y/s), (float)(t.a.z/s));
|
||||||
auto b = q3d::Vector3(t.b.x/s, t.b.y/s, t.b.z/s);
|
auto b = q3d::Vector3((float)(t.b.x/s), (float)(t.b.y/s), (float)(t.b.z/s));
|
||||||
auto c = q3d::Vector3(t.c.x/s, t.c.y/s, t.c.z/s);
|
auto c = q3d::Vector3((float)(t.c.x/s), (float)(t.c.y/s), (float)(t.c.z/s));
|
||||||
auto fn = q3d::Vector3(faceNormal.x, faceNormal.y, faceNormal.x);
|
auto fn = q3d::Vector3((float)faceNormal.x, (float)faceNormal.y, (float)faceNormal.x);
|
||||||
auto n1 = q3d::Vector3(t.normals[0].x, t.normals[0].y, t.normals[0].z);
|
auto n1 = q3d::Vector3((float)t.normals[0].x, (float)t.normals[0].y, (float)t.normals[0].z);
|
||||||
auto n2 = q3d::Vector3(t.normals[1].x, t.normals[1].y, t.normals[1].z);
|
auto n2 = q3d::Vector3((float)t.normals[1].x, (float)t.normals[1].y, (float)t.normals[1].z);
|
||||||
auto n3 = q3d::Vector3(t.normals[2].x, t.normals[2].y, t.normals[2].z);
|
auto n3 = q3d::Vector3((float)t.normals[2].x, (float)t.normals[2].y, (float)t.normals[2].z);
|
||||||
auto tri = q3d::CreateTriangle(builder, &a, &b, &c, &fn, &n1, &n2, &n3);
|
auto tri = q3d::CreateTriangle(builder, &a, &b, &c, &fn, &n1, &n2, &n3);
|
||||||
materialTriangles[color].push_back(tri);
|
materialTriangles[color].push_back(tri);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace SolveSpace;
|
||||||
+ (NSToolTipManager *)sharedToolTipManager;
|
+ (NSToolTipManager *)sharedToolTipManager;
|
||||||
- (void)setInitialToolTipDelay:(double)delay;
|
- (void)setInitialToolTipDelay:(double)delay;
|
||||||
- (void)orderOutToolTip;
|
- (void)orderOutToolTip;
|
||||||
|
- (void)abortToolTip;
|
||||||
- (void)_displayTemporaryToolTipForView:(id)arg1 withString:(id)arg2;
|
- (void)_displayTemporaryToolTipForView:(id)arg1 withString:(id)arg2;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -909,7 +910,11 @@ public:
|
||||||
|
|
||||||
NSToolTipManager *nsToolTipManager = [NSToolTipManager sharedToolTipManager];
|
NSToolTipManager *nsToolTipManager = [NSToolTipManager sharedToolTipManager];
|
||||||
if(newText.empty()) {
|
if(newText.empty()) {
|
||||||
[nsToolTipManager orderOutToolTip];
|
if ([nsToolTipManager respondsToSelector:@selector(abortToolTip)]) {
|
||||||
|
[nsToolTipManager abortToolTip];
|
||||||
|
} else {
|
||||||
|
[nsToolTipManager orderOutToolTip];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
[nsToolTipManager _displayTemporaryToolTipForView:ssView withString:Wrap(newText)];
|
[nsToolTipManager _displayTemporaryToolTipForView:ssView withString:Wrap(newText)];
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,9 +73,9 @@ namespace Platform {
|
||||||
void CheckLastError(const char *file, int line, const char *function, const char *expr) {
|
void CheckLastError(const char *file, int line, const char *function, const char *expr) {
|
||||||
if(GetLastError() != S_OK) {
|
if(GetLastError() != S_OK) {
|
||||||
LPWSTR messageW;
|
LPWSTR messageW;
|
||||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
|
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
|
||||||
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
(LPWSTR)&messageW, 0, NULL);
|
(LPWSTR)&messageW, 0, NULL);
|
||||||
|
|
||||||
std::string message;
|
std::string message;
|
||||||
message += ssprintf("File %s, line %u, function %s:\n", file, line, function);
|
message += ssprintf("File %s, line %u, function %s:\n", file, line, function);
|
||||||
|
@ -203,8 +203,8 @@ public:
|
||||||
uint32_t ThawInt(const std::string &key, uint32_t defaultValue) {
|
uint32_t ThawInt(const std::string &key, uint32_t defaultValue) {
|
||||||
DWORD value;
|
DWORD value;
|
||||||
DWORD type, length = sizeof(value);
|
DWORD type, length = sizeof(value);
|
||||||
LSTATUS result = RegQueryValueEx(GetKey(), &Widen(key)[0], 0,
|
LSTATUS result = RegQueryValueExW(GetKey(), &Widen(key)[0], 0,
|
||||||
&type, (BYTE *)&value, &length);
|
&type, (BYTE *)&value, &length);
|
||||||
if(result == ERROR_SUCCESS && type == REG_DWORD) {
|
if(result == ERROR_SUCCESS && type == REG_DWORD) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -219,8 +219,8 @@ public:
|
||||||
double ThawFloat(const std::string &key, double defaultValue) {
|
double ThawFloat(const std::string &key, double defaultValue) {
|
||||||
double value;
|
double value;
|
||||||
DWORD type, length = sizeof(value);
|
DWORD type, length = sizeof(value);
|
||||||
LSTATUS result = RegQueryValueEx(GetKey(), &Widen(key)[0], 0,
|
LSTATUS result = RegQueryValueExW(GetKey(), &Widen(key)[0], 0,
|
||||||
&type, (BYTE *)&value, &length);
|
&type, (BYTE *)&value, &length);
|
||||||
if(result == ERROR_SUCCESS && type == REG_QWORD) {
|
if(result == ERROR_SUCCESS && type == REG_QWORD) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -237,13 +237,13 @@ public:
|
||||||
|
|
||||||
std::string ThawString(const std::string &key, const std::string &defaultValue) {
|
std::string ThawString(const std::string &key, const std::string &defaultValue) {
|
||||||
DWORD type, length = 0;
|
DWORD type, length = 0;
|
||||||
LSTATUS result = RegQueryValueEx(GetKey(), &Widen(key)[0], 0,
|
LSTATUS result = RegQueryValueExW(GetKey(), &Widen(key)[0], 0,
|
||||||
&type, NULL, &length);
|
&type, NULL, &length);
|
||||||
if(result == ERROR_SUCCESS && type == REG_SZ) {
|
if(result == ERROR_SUCCESS && type == REG_SZ) {
|
||||||
std::wstring valueW;
|
std::wstring valueW;
|
||||||
valueW.resize(length / 2 - 1);
|
valueW.resize(length / 2 - 1);
|
||||||
sscheck(RegQueryValueEx(GetKey(), &Widen(key)[0], 0,
|
sscheck(RegQueryValueExW(GetKey(), &Widen(key)[0], 0,
|
||||||
&type, (BYTE *)&valueW[0], &length));
|
&type, (BYTE *)&valueW[0], &length));
|
||||||
return Narrow(valueW);
|
return Narrow(valueW);
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
@ -538,7 +538,7 @@ public:
|
||||||
static bool registered;
|
static bool registered;
|
||||||
if(registered) return;
|
if(registered) return;
|
||||||
|
|
||||||
WNDCLASSEX wc = {};
|
WNDCLASSEXW wc = {};
|
||||||
wc.cbSize = sizeof(wc);
|
wc.cbSize = sizeof(wc);
|
||||||
wc.style = CS_BYTEALIGNCLIENT|CS_BYTEALIGNWINDOW|CS_OWNDC|CS_DBLCLKS;
|
wc.style = CS_BYTEALIGNCLIENT|CS_BYTEALIGNWINDOW|CS_OWNDC|CS_DBLCLKS;
|
||||||
wc.lpfnWndProc = WndProc;
|
wc.lpfnWndProc = WndProc;
|
||||||
|
@ -549,7 +549,7 @@ public:
|
||||||
IMAGE_ICON, 16, 16, 0);
|
IMAGE_ICON, 16, 16, 0);
|
||||||
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
|
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
|
||||||
wc.lpszClassName = L"SolveSpace";
|
wc.lpszClassName = L"SolveSpace";
|
||||||
sscheck(RegisterClassEx(&wc));
|
sscheck(RegisterClassExW(&wc));
|
||||||
registered = true;
|
registered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,7 +702,7 @@ public:
|
||||||
// The wndproc may be called from within CreateWindowEx, and before we've associated
|
// The wndproc may be called from within CreateWindowEx, and before we've associated
|
||||||
// the window with the WindowImplWin32. In that case, just defer to the default wndproc.
|
// the window with the WindowImplWin32. In that case, just defer to the default wndproc.
|
||||||
if(window == NULL) {
|
if(window == NULL) {
|
||||||
return DefWindowProc(h, msg, wParam, lParam);
|
return DefWindowProcW(h, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_SPACEWARE)
|
#if defined(HAVE_SPACEWARE)
|
||||||
|
@ -999,7 +999,7 @@ public:
|
||||||
sscheck(SetForegroundWindow(hParent));
|
sscheck(SetForegroundWindow(hParent));
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
return DefWindowProc(h, msg, wParam, lParam);
|
return DefWindowProcW(h, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1042,7 +1042,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return DefWindowProc(h, msg, wParam, lParam);
|
return DefWindowProcW(h, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1227,7 +1227,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCursor(Cursor cursor) override {
|
void SetCursor(Cursor cursor) override {
|
||||||
LPWSTR cursorName;
|
LPWSTR cursorName = IDC_ARROW;
|
||||||
switch(cursor) {
|
switch(cursor) {
|
||||||
case Cursor::POINTER: cursorName = IDC_ARROW; break;
|
case Cursor::POINTER: cursorName = IDC_ARROW; break;
|
||||||
case Cursor::HAND: cursorName = IDC_HAND; break;
|
case Cursor::HAND: cursorName = IDC_HAND; break;
|
||||||
|
@ -1389,7 +1389,7 @@ WindowRef CreateWindow(Window::Kind kind, WindowRef parentWindow) {
|
||||||
static HWND hSpaceWareDriverClass;
|
static HWND hSpaceWareDriverClass;
|
||||||
|
|
||||||
void Open3DConnexion() {
|
void Open3DConnexion() {
|
||||||
HWND hSpaceWareDriverClass = FindWindowW(L"SpaceWare Driver Class", NULL);
|
hSpaceWareDriverClass = FindWindowW(L"SpaceWare Driver Class", NULL);
|
||||||
if(hSpaceWareDriverClass != NULL) {
|
if(hSpaceWareDriverClass != NULL) {
|
||||||
SiInitialize();
|
SiInitialize();
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,8 +285,8 @@ public:
|
||||||
const Camera &GetCamera() const override { return camera; }
|
const Camera &GetCamera() const override { return camera; }
|
||||||
|
|
||||||
// ViewportCanvas interface.
|
// ViewportCanvas interface.
|
||||||
void SetCamera(const Camera &camera) override { this->camera = camera; }
|
void SetCamera(const Camera &cam) override { this->camera = cam; }
|
||||||
void SetLighting(const Lighting &lighting) override { this->lighting = lighting; }
|
void SetLighting(const Lighting &light) override { this->lighting = light; }
|
||||||
|
|
||||||
void DrawLine(const Vector &a, const Vector &b, hStroke hcs) override;
|
void DrawLine(const Vector &a, const Vector &b, hStroke hcs) override;
|
||||||
void DrawEdges(const SEdgeList &el, hStroke hcs) override;
|
void DrawEdges(const SEdgeList &el, hStroke hcs) override;
|
||||||
|
|
|
@ -708,8 +708,8 @@ void OpenGl1Renderer::UpdateProjection() {
|
||||||
UnSelectPrimitive();
|
UnSelectPrimitive();
|
||||||
|
|
||||||
glViewport(0, 0,
|
glViewport(0, 0,
|
||||||
camera.width * camera.pixelRatio,
|
(GLsizei)(camera.width * camera.pixelRatio),
|
||||||
camera.height * camera.pixelRatio);
|
(GLsizei)(camera.height * camera.pixelRatio));
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
@ -821,8 +821,8 @@ void OpenGl1Renderer::FinishFrame() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Pixmap> OpenGl1Renderer::ReadFrame() {
|
std::shared_ptr<Pixmap> OpenGl1Renderer::ReadFrame() {
|
||||||
int width = camera.width * camera.pixelRatio;
|
int width = (int)(camera.width * camera.pixelRatio);
|
||||||
int height = camera.height * camera.pixelRatio;
|
int height = (int)(camera.height * camera.pixelRatio);
|
||||||
std::shared_ptr<Pixmap> pixmap =
|
std::shared_ptr<Pixmap> pixmap =
|
||||||
Pixmap::Create(Pixmap::Format::RGB, (size_t)width, (size_t)height);
|
Pixmap::Create(Pixmap::Format::RGB, (size_t)width, (size_t)height);
|
||||||
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, &pixmap->data[0]);
|
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, &pixmap->data[0]);
|
||||||
|
|
|
@ -361,7 +361,7 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) {
|
||||||
}
|
}
|
||||||
|
|
||||||
v /= pow((viewUnits == Unit::INCHES) ? 25.4 : 1000, dim);
|
v /= pow((viewUnits == Unit::INCHES) ? 25.4 : 1000, dim);
|
||||||
int vdeg = floor((log10(fabs(v))) / dim);
|
int vdeg = (int)((log10(fabs(v))) / dim);
|
||||||
std::string unit;
|
std::string unit;
|
||||||
if(fabs(v) > 0.0) {
|
if(fabs(v) > 0.0) {
|
||||||
int sdeg = 0;
|
int sdeg = 0;
|
||||||
|
@ -371,7 +371,7 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) {
|
||||||
: SelectSIPrefixMm(vdeg);
|
: SelectSIPrefixMm(vdeg);
|
||||||
v /= pow(10.0, sdeg * dim);
|
v /= pow(10.0, sdeg * dim);
|
||||||
}
|
}
|
||||||
int pdeg = ceil(log10(fabs(v) + 1e-10));
|
int pdeg = (int)ceil(log10(fabs(v) + 1e-10));
|
||||||
return ssprintf("%#.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v,
|
return ssprintf("%#.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v,
|
||||||
compact ? "" : " ", unit.c_str(), DimToString(dim));
|
compact ? "" : " ", unit.c_str(), DimToString(dim));
|
||||||
}
|
}
|
||||||
|
@ -802,7 +802,6 @@ void SolveSpaceUI::MenuAnalyze(Command id) {
|
||||||
case Command::AREA: {
|
case Command::AREA: {
|
||||||
Group *g = SK.GetGroup(SS.GW.activeGroup);
|
Group *g = SK.GetGroup(SS.GW.activeGroup);
|
||||||
SS.GW.GroupSelection();
|
SS.GW.GroupSelection();
|
||||||
auto const &gs = SS.GW.gs;
|
|
||||||
|
|
||||||
if(gs.faces > 0) {
|
if(gs.faces > 0) {
|
||||||
std::vector<uint32_t> faces;
|
std::vector<uint32_t> faces;
|
||||||
|
@ -844,8 +843,8 @@ void SolveSpaceUI::MenuAnalyze(Command id) {
|
||||||
if(gs.n > 0 && gs.n == gs.entities) {
|
if(gs.n > 0 && gs.n == gs.entities) {
|
||||||
double perimeter = 0.0;
|
double perimeter = 0.0;
|
||||||
for(int i = 0; i < gs.entities; i++) {
|
for(int i = 0; i < gs.entities; i++) {
|
||||||
Entity *e = SK.entity.FindById(gs.entity[i]);
|
Entity *en = SK.entity.FindById(gs.entity[i]);
|
||||||
SEdgeList *el = e->GetOrGenerateEdges();
|
SEdgeList *el = en->GetOrGenerateEdges();
|
||||||
for(const SEdge &e : el->l) {
|
for(const SEdge &e : el->l) {
|
||||||
perimeter += e.b.Minus(e.a).Magnitude();
|
perimeter += e.b.Minus(e.a).Magnitude();
|
||||||
}
|
}
|
||||||
|
|
|
@ -646,7 +646,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
|
||||||
// for testing - hard code the axial distance, and number of sections.
|
// for testing - hard code the axial distance, and number of sections.
|
||||||
// distance will need to be parameters in the future.
|
// distance will need to be parameters in the future.
|
||||||
double dist = distf - dists;
|
double dist = distf - dists;
|
||||||
int sections = fabs(anglef - angles) / (PI / 2) + 1;
|
int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1);
|
||||||
double wedge = (anglef - angles) / sections;
|
double wedge = (anglef - angles) / sections;
|
||||||
|
|
||||||
if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) {
|
if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) {
|
||||||
|
|
|
@ -604,7 +604,7 @@ void TextWindow::ScreenStepDimGo(int link, uint32_t v) {
|
||||||
if(time - SS.TW.stepDim.time < STEP_MILLIS) {
|
if(time - SS.TW.stepDim.time < STEP_MILLIS) {
|
||||||
SS.TW.stepDim.timer->RunAfterNextFrame();
|
SS.TW.stepDim.timer->RunAfterNextFrame();
|
||||||
} else {
|
} else {
|
||||||
SS.TW.stepDim.timer->RunAfter(time - SS.TW.stepDim.time - STEP_MILLIS);
|
SS.TW.stepDim.timer->RunAfter((unsigned)(time - SS.TW.stepDim.time - STEP_MILLIS));
|
||||||
}
|
}
|
||||||
SS.TW.stepDim.time = time;
|
SS.TW.stepDim.time = time;
|
||||||
} else {
|
} else {
|
||||||
|
@ -758,7 +758,8 @@ void TextWindow::EditControlDone(std::string s) {
|
||||||
|
|
||||||
Group *g = SK.group.FindByIdNoOops(SS.TW.shown.group);
|
Group *g = SK.group.FindByIdNoOops(SS.TW.shown.group);
|
||||||
if(!g) break;
|
if(!g) break;
|
||||||
g->color = RgbaColor::FromFloat(rgb.x, rgb.y, rgb.z, g->color.alphaF());
|
g->color = RgbaColor::FromFloat((float)rgb.x, (float)rgb.y, (float)rgb.z,
|
||||||
|
g->color.alphaF());
|
||||||
|
|
||||||
SS.MarkGroupDirty(g->h);
|
SS.MarkGroupDirty(g->h);
|
||||||
SS.GW.ClearSuper();
|
SS.GW.ClearSuper();
|
||||||
|
|
|
@ -219,7 +219,7 @@ bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, UiCanvas *canvas,
|
||||||
{
|
{
|
||||||
if(hitCommand) *hitCommand = icon.command;
|
if(hitCommand) *hitCommand = icon.command;
|
||||||
if(hitX) *hitX = x - boxhw;
|
if(hitX) *hitX = x - boxhw;
|
||||||
if(hitY) *hitY = height - (y + boxhw);
|
if(hitY) *hitY = (int)height - (y + boxhw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue