summaryrefslogtreecommitdiffhomepage
path: root/Magic2/UVMapView.cpp
diff options
context:
space:
mode:
authormilo24x7@gmail.com <milo24x7@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544>2013-07-07 21:51:48 +0000
committermilo24x7@gmail.com <milo24x7@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544>2013-07-07 21:51:48 +0000
commit1de4b2bdbb019be6f1b7262c3eba5568d7682edd (patch)
tree3f8a1fc086daa93b24929886e1bf15b918ea9b94 /Magic2/UVMapView.cpp
parent073ef05b192338247ea304f2a72615633947b446 (diff)
downloadstarshatter-1de4b2bdbb019be6f1b7262c3eba5568d7682edd.zip
starshatter-1de4b2bdbb019be6f1b7262c3eba5568d7682edd.tar.gz
starshatter-1de4b2bdbb019be6f1b7262c3eba5568d7682edd.tar.bz2
Updated open source license declaration and fixed some formatting issues.
Diffstat (limited to 'Magic2/UVMapView.cpp')
-rw-r--r--Magic2/UVMapView.cpp924
1 files changed, 474 insertions, 450 deletions
diff --git a/Magic2/UVMapView.cpp b/Magic2/UVMapView.cpp
index 673745f..d775b5c 100644
--- a/Magic2/UVMapView.cpp
+++ b/Magic2/UVMapView.cpp
@@ -1,450 +1,474 @@
-/* Project Magic 2.0
- Destroyer Studios LLC
- Copyright © 1997-2004. All Rights Reserved.
-
- SUBSYSTEM: Magic.exe
- FILE: UVMapView.cpp
- AUTHOR: John DiCamillo
-
-
- OVERVIEW
- ========
- Implementation of the UVMapView class
-*/
-
-#include "stdafx.h"
-#include "Magic.h"
-
-#include "MagicDoc.h"
-#include "UVMapView.h"
-#include "Selector.h"
-#include "Selection.h"
-
-#include "ActiveWindow.h"
-#include "Color.h"
-#include "Screen.h"
-#include "Video.h"
-
-DWORD GetRealTime();
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#undef THIS_FILE
-static char THIS_FILE[] = __FILE__;
-#endif
-
-// +--------------------------------------------------------------------+
-
-UVMapView::UVMapView(Window* c)
- : View(c), material(0), zoom(1), x_offset(0), y_offset(0),
- nmarks(0), select_mode(SELECT_REPLACE), active(false)
-{
-}
-
-UVMapView::~UVMapView()
-{
-}
-
-// +--------------------------------------------------------------------+
-
-const int BATCH_SIZE = 64;
-
-void
-UVMapView::Refresh()
-{
- video = Video::GetInstance();
- if (!video)
- return;
-
- window->FillRect(window->GetRect(), Color::LightGray);
-
- if (material && material->tex_diffuse) {
- Bitmap* bmp = material->tex_diffuse;
- int w = bmp->Width();
- int h = bmp->Height();
-
- double cx = window->Width() / 2 + x_offset;
- double cy = window->Height() / 2 + y_offset;
-
- int x1 = (int) (cx - (zoom * w/2));
- int x2 = (int) (cx + (zoom * w/2));
- int y1 = (int) (cy - (zoom * h/2));
- int y2 = (int) (cy + (zoom * h/2));
-
- window->DrawBitmap(x1, y1, x2, y2, bmp);
-
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* p = iter.value();
- VertexSet* vset = p->vertex_set;
-
- if (p->material != material)
- continue;
-
- for (int i = 0; i < p->nverts; i++) {
- int n1 = p->verts[i];
- int n2 = p->verts[0];
- if (i < p->nverts-1)
- n2 = p->verts[i+1];
-
- double tu1 = vset->tu[n1];
- double tv1 = vset->tv[n1];
- double tu2 = vset->tu[n2];
- double tv2 = vset->tv[n2];
-
- x1 = (int) (cx + zoom * w * (tu1-0.5));
- x2 = (int) (cx + zoom * w * (tu2-0.5));
- y1 = (int) (cy + zoom * h * (tv1-0.5));
- y2 = (int) (cy + zoom * h * (tv2-0.5));
-
- window->DrawLine(x1, y1, x2, y2, Color::Yellow);
-
- if (IsSelected(p, i))
- window->FillRect(x1-3, y1-3, x1+3, y1+3, Color::Yellow);
- else
- window->DrawRect(x1-2, y1-2, x1+2, y1+2, Color::Yellow);
- }
- }
- }
-
- if (active && nmarks > 1) {
- float points[4*BATCH_SIZE + 4];
-
- for (int batch = 0; batch < nmarks; batch += BATCH_SIZE) {
- int end = batch + BATCH_SIZE;
- if (end > nmarks-1)
- end = nmarks-1;
- int nlines = end-batch;
-
- for (int i = 0; i < nlines; i++) {
- points[4*i+0] = (float) marks[batch + i].x;
- points[4*i+1] = (float) marks[batch + i].y;
- points[4*i+2] = (float) marks[batch + i + 1].x;
- points[4*i+3] = (float) marks[batch + i + 1].y;
- }
-
- video->DrawScreenLines(nlines, points, Color::Cyan);
- }
- }
-
- const char* title = "UV Editor";
-
- int len = strlen(title);
- Rect r(6,4,200,20);
-
- r.x += window->GetRect().x;
- r.y += window->GetRect().y;
-
- video->DrawText(title, len, r, DT_LEFT|DT_SINGLELINE, Color::Black);
-
- r.x--;
- r.y--;
-
- video->DrawText(title, len, r, DT_LEFT|DT_SINGLELINE, Color::White);
-}
-
-// +--------------------------------------------------------------------+
-
-void
-UVMapView::UseMaterial(Material* m)
-{
- if (material != m) {
- material = m;
- zoom = 1;
- x_offset = 0;
- y_offset = 0;
- }
-}
-
-void
-UVMapView::UsePolys(List<Poly>& p)
-{
- polys.clear();
- polys.append(p);
-}
-
-void
-UVMapView::MoveBy(double dx, double dy)
-{
- x_offset += dx;
- y_offset += dy;
-}
-
-void
-UVMapView::DragBy(double dx, double dy)
-{
- if (!material || !material->tex_diffuse || selverts.size() < 1)
- return;
-
- Bitmap* bmp = material->tex_diffuse;
- double w = zoom * bmp->Width();
- double h = zoom * bmp->Height();
- float du = (float) (dx/w);
- float dv = (float) (dy/h);
-
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- DWORD value = *svi;
- DWORD p = value >> 16;
- DWORD n = value & 0xffff;
-
- Poly* poly = polys[p];
- if (poly && n < poly->nverts) {
- VertexSet* vset = poly->vertex_set;
- int v = poly->verts[n];
-
- vset->tu[v] += du;
- vset->tv[v] += dv;
- }
- }
-}
-
-// +----------------------------------------------------------------------+
-
-void
-UVMapView::Clear()
-{
- selverts.clear();
-}
-
-void
-UVMapView::Begin(int seln_mode)
-{
- nmarks = 0;
- select_mode = seln_mode;
- active = true;
-}
-
-void
-UVMapView::AddMark(CPoint& p)
-{
- if (nmarks < MAX_MARK)
- marks[nmarks++] = p;
-}
-
-void
-UVMapView::End()
-{
- active = false;
-
- // get the model:
- if (!nmarks || !material || !material->tex_diffuse) return;
-
- // if not adding to selection:
- if (select_mode == SELECT_REPLACE) {
- Clear();
- }
-
- Bitmap* bmp = material->tex_diffuse;
- int w = bmp->Width();
- int h = bmp->Height();
-
- double cx = window->Width() / 2 + x_offset;
- double cy = window->Height() / 2 + y_offset;
-
-
- // if only one mark:
- if (nmarks < 2) {
- // find all selected verts:
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* p = iter.value();
- VertexSet* vset = p->vertex_set;
-
- for (int i = 0; i < p->nverts; i++) {
- int n1 = p->verts[i];
- double tu1 = vset->tu[n1];
- double tv1 = vset->tv[n1];
-
- int x1 = (int) (cx + zoom * w * (tu1-0.5));
- int y1 = (int) (cy + zoom * h * (tv1-0.5));
-
- int dx = abs(marks[0].x - x1);
- int dy = abs(marks[0].y - y1);
-
- if (dx < 4 && dy < 4) {
- WORD p_index = iter.index();
- DWORD value = (p_index << 16) | i;
-
- if (select_mode == SELECT_REMOVE) {
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- if (*svi == value) {
- selverts.erase(svi);
- }
- }
- }
- else {
- bool contains = false;
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- if (*svi == value) {
- contains = true;
- }
- }
- if (!contains)
- selverts.push_back(value);
- }
- }
- }
- }
- }
-
- // otherwise, build a region:
- else {
- CRgn rgn;
- rgn.CreatePolygonRgn(marks, nmarks, WINDING);
-
- // find all selected verts:
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* p = iter.value();
- VertexSet* vset = p->vertex_set;
-
- for (int i = 0; i < p->nverts; i++) {
- int n1 = p->verts[i];
- double tu1 = vset->tu[n1];
- double tv1 = vset->tv[n1];
-
- int x1 = (int) (cx + zoom * w * (tu1-0.5));
- int y1 = (int) (cy + zoom * h * (tv1-0.5));
-
- CPoint p(x1,y1);
-
- if (rgn.PtInRegion(p)) {
- WORD p_index = iter.index();
- DWORD value = (p_index << 16) | i;
-
- if (select_mode == SELECT_REMOVE) {
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- if (*svi == value)
- selverts.erase(svi);
- }
- }
- else {
- bool contains = false;
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- if (*svi == value)
- contains = true;
- }
- if (!contains)
- selverts.push_back(value);
- }
- }
- }
- }
- }
-
- nmarks = 0;
-}
-
-// +----------------------------------------------------------------------+
-
-void
-UVMapView::SelectAll()
-{
- selverts.clear();
-
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* p = iter.value();
-
- if (p->material != material)
- continue;
-
- for (int i = 0; i < p->nverts; i++) {
- WORD p_index = iter.index();
- DWORD value = (p_index << 16) | i;
- selverts.push_back(value);
- }
- }
-}
-
-void
-UVMapView::SelectNone()
-{
- selverts.clear();
-}
-
-void
-UVMapView::SelectInverse()
-{
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* p = iter.value();
-
- if (p->material != material)
- continue;
-
- for (int i = 0; i < p->nverts; i++) {
- WORD p_index = iter.index();
- DWORD value = (p_index << 16) | i;
-
- bool contains = false;
- auto svi = selverts.begin();
- for (; svi != selverts.end(); ++svi) {
- if (*svi == value) {
- contains = true;
- break;
- }
- }
-
- if (contains)
- selverts.erase(svi);
- else
- selverts.push_back(value);
- }
- }
-}
-
-bool
-UVMapView::IsSelected(Poly* poly, WORD v)
-{
- WORD p = polys.index(poly);
- DWORD value = (p << 16) | v;
-
- bool contains = false;
-
- for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
- if (*svi == value)
- return true;
- }
-
- return false;
-}
-
-bool
-UVMapView::WillSelect(CPoint& p)
-{
- if (!material || !material->tex_diffuse)
- return false;
-
- Bitmap* bmp = material->tex_diffuse;
- int w = bmp->Width();
- int h = bmp->Height();
-
- double cx = window->Width() / 2 + x_offset;
- double cy = window->Height() / 2 + y_offset;
-
- // find first selected vert:
- ListIter<Poly> iter = polys;
- while (++iter) {
- Poly* poly = iter.value();
- VertexSet* vset = poly->vertex_set;
-
- for (int i = 0; i < poly->nverts; i++) {
- int n1 = poly->verts[i];
- double tu1 = vset->tu[n1];
- double tv1 = vset->tv[n1];
-
- int x1 = (int) (cx + zoom * w * (tu1-0.5));
- int y1 = (int) (cy + zoom * h * (tv1-0.5));
-
- int dx = abs(p.x - x1);
- int dy = abs(p.y - y1);
-
- if (dx < 4 && dy < 4) {
- return true;
- }
- }
- }
-
- return false;
-}
+/* Starshatter OpenSource Distribution
+ Copyright (c) 1997-2004, Destroyer Studios LLC.
+ All Rights Reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name "Destroyer Studios" nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ SUBSYSTEM: Magic.exe
+ FILE: UVMapView.cpp
+ AUTHOR: John DiCamillo
+
+
+ OVERVIEW
+ ========
+ Implementation of the UVMapView class
+*/
+
+#include "stdafx.h"
+#include "Magic.h"
+
+#include "MagicDoc.h"
+#include "UVMapView.h"
+#include "Selector.h"
+#include "Selection.h"
+
+#include "ActiveWindow.h"
+#include "Color.h"
+#include "Screen.h"
+#include "Video.h"
+
+DWORD GetRealTime();
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+// +--------------------------------------------------------------------+
+
+UVMapView::UVMapView(Window* c)
+ : View(c), material(0), zoom(1), x_offset(0), y_offset(0),
+ nmarks(0), select_mode(SELECT_REPLACE), active(false)
+{
+}
+
+UVMapView::~UVMapView()
+{
+}
+
+// +--------------------------------------------------------------------+
+
+const int BATCH_SIZE = 64;
+
+void
+UVMapView::Refresh()
+{
+ video = Video::GetInstance();
+ if (!video)
+ return;
+
+ window->FillRect(window->GetRect(), Color::LightGray);
+
+ if (material && material->tex_diffuse) {
+ Bitmap* bmp = material->tex_diffuse;
+ int w = bmp->Width();
+ int h = bmp->Height();
+
+ double cx = window->Width() / 2 + x_offset;
+ double cy = window->Height() / 2 + y_offset;
+
+ int x1 = (int) (cx - (zoom * w/2));
+ int x2 = (int) (cx + (zoom * w/2));
+ int y1 = (int) (cy - (zoom * h/2));
+ int y2 = (int) (cy + (zoom * h/2));
+
+ window->DrawBitmap(x1, y1, x2, y2, bmp);
+
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* p = iter.value();
+ VertexSet* vset = p->vertex_set;
+
+ if (p->material != material)
+ continue;
+
+ for (int i = 0; i < p->nverts; i++) {
+ int n1 = p->verts[i];
+ int n2 = p->verts[0];
+ if (i < p->nverts-1)
+ n2 = p->verts[i+1];
+
+ double tu1 = vset->tu[n1];
+ double tv1 = vset->tv[n1];
+ double tu2 = vset->tu[n2];
+ double tv2 = vset->tv[n2];
+
+ x1 = (int) (cx + zoom * w * (tu1-0.5));
+ x2 = (int) (cx + zoom * w * (tu2-0.5));
+ y1 = (int) (cy + zoom * h * (tv1-0.5));
+ y2 = (int) (cy + zoom * h * (tv2-0.5));
+
+ window->DrawLine(x1, y1, x2, y2, Color::Yellow);
+
+ if (IsSelected(p, i))
+ window->FillRect(x1-3, y1-3, x1+3, y1+3, Color::Yellow);
+ else
+ window->DrawRect(x1-2, y1-2, x1+2, y1+2, Color::Yellow);
+ }
+ }
+ }
+
+ if (active && nmarks > 1) {
+ float points[4*BATCH_SIZE + 4];
+
+ for (int batch = 0; batch < nmarks; batch += BATCH_SIZE) {
+ int end = batch + BATCH_SIZE;
+ if (end > nmarks-1)
+ end = nmarks-1;
+ int nlines = end-batch;
+
+ for (int i = 0; i < nlines; i++) {
+ points[4*i+0] = (float) marks[batch + i].x;
+ points[4*i+1] = (float) marks[batch + i].y;
+ points[4*i+2] = (float) marks[batch + i + 1].x;
+ points[4*i+3] = (float) marks[batch + i + 1].y;
+ }
+
+ video->DrawScreenLines(nlines, points, Color::Cyan);
+ }
+ }
+
+ const char* title = "UV Editor";
+
+ int len = strlen(title);
+ Rect r(6,4,200,20);
+
+ r.x += window->GetRect().x;
+ r.y += window->GetRect().y;
+
+ video->DrawText(title, len, r, DT_LEFT|DT_SINGLELINE, Color::Black);
+
+ r.x--;
+ r.y--;
+
+ video->DrawText(title, len, r, DT_LEFT|DT_SINGLELINE, Color::White);
+}
+
+// +--------------------------------------------------------------------+
+
+void
+UVMapView::UseMaterial(Material* m)
+{
+ if (material != m) {
+ material = m;
+ zoom = 1;
+ x_offset = 0;
+ y_offset = 0;
+ }
+}
+
+void
+UVMapView::UsePolys(List<Poly>& p)
+{
+ polys.clear();
+ polys.append(p);
+}
+
+void
+UVMapView::MoveBy(double dx, double dy)
+{
+ x_offset += dx;
+ y_offset += dy;
+}
+
+void
+UVMapView::DragBy(double dx, double dy)
+{
+ if (!material || !material->tex_diffuse || selverts.size() < 1)
+ return;
+
+ Bitmap* bmp = material->tex_diffuse;
+ double w = zoom * bmp->Width();
+ double h = zoom * bmp->Height();
+ float du = (float) (dx/w);
+ float dv = (float) (dy/h);
+
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ DWORD value = *svi;
+ DWORD p = value >> 16;
+ DWORD n = value & 0xffff;
+
+ Poly* poly = polys[p];
+ if (poly && n < poly->nverts) {
+ VertexSet* vset = poly->vertex_set;
+ int v = poly->verts[n];
+
+ vset->tu[v] += du;
+ vset->tv[v] += dv;
+ }
+ }
+}
+
+// +----------------------------------------------------------------------+
+
+void
+UVMapView::Clear()
+{
+ selverts.clear();
+}
+
+void
+UVMapView::Begin(int seln_mode)
+{
+ nmarks = 0;
+ select_mode = seln_mode;
+ active = true;
+}
+
+void
+UVMapView::AddMark(CPoint& p)
+{
+ if (nmarks < MAX_MARK)
+ marks[nmarks++] = p;
+}
+
+void
+UVMapView::End()
+{
+ active = false;
+
+ // get the model:
+ if (!nmarks || !material || !material->tex_diffuse) return;
+
+ // if not adding to selection:
+ if (select_mode == SELECT_REPLACE) {
+ Clear();
+ }
+
+ Bitmap* bmp = material->tex_diffuse;
+ int w = bmp->Width();
+ int h = bmp->Height();
+
+ double cx = window->Width() / 2 + x_offset;
+ double cy = window->Height() / 2 + y_offset;
+
+
+ // if only one mark:
+ if (nmarks < 2) {
+ // find all selected verts:
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* p = iter.value();
+ VertexSet* vset = p->vertex_set;
+
+ for (int i = 0; i < p->nverts; i++) {
+ int n1 = p->verts[i];
+ double tu1 = vset->tu[n1];
+ double tv1 = vset->tv[n1];
+
+ int x1 = (int) (cx + zoom * w * (tu1-0.5));
+ int y1 = (int) (cy + zoom * h * (tv1-0.5));
+
+ int dx = abs(marks[0].x - x1);
+ int dy = abs(marks[0].y - y1);
+
+ if (dx < 4 && dy < 4) {
+ WORD p_index = iter.index();
+ DWORD value = (p_index << 16) | i;
+
+ if (select_mode == SELECT_REMOVE) {
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ if (*svi == value) {
+ selverts.erase(svi);
+ }
+ }
+ }
+ else {
+ bool contains = false;
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ if (*svi == value) {
+ contains = true;
+ }
+ }
+ if (!contains)
+ selverts.push_back(value);
+ }
+ }
+ }
+ }
+ }
+
+ // otherwise, build a region:
+ else {
+ CRgn rgn;
+ rgn.CreatePolygonRgn(marks, nmarks, WINDING);
+
+ // find all selected verts:
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* p = iter.value();
+ VertexSet* vset = p->vertex_set;
+
+ for (int i = 0; i < p->nverts; i++) {
+ int n1 = p->verts[i];
+ double tu1 = vset->tu[n1];
+ double tv1 = vset->tv[n1];
+
+ int x1 = (int) (cx + zoom * w * (tu1-0.5));
+ int y1 = (int) (cy + zoom * h * (tv1-0.5));
+
+ CPoint p(x1,y1);
+
+ if (rgn.PtInRegion(p)) {
+ WORD p_index = iter.index();
+ DWORD value = (p_index << 16) | i;
+
+ if (select_mode == SELECT_REMOVE) {
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ if (*svi == value)
+ selverts.erase(svi);
+ }
+ }
+ else {
+ bool contains = false;
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ if (*svi == value)
+ contains = true;
+ }
+ if (!contains)
+ selverts.push_back(value);
+ }
+ }
+ }
+ }
+ }
+
+ nmarks = 0;
+}
+
+// +----------------------------------------------------------------------+
+
+void
+UVMapView::SelectAll()
+{
+ selverts.clear();
+
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* p = iter.value();
+
+ if (p->material != material)
+ continue;
+
+ for (int i = 0; i < p->nverts; i++) {
+ WORD p_index = iter.index();
+ DWORD value = (p_index << 16) | i;
+ selverts.push_back(value);
+ }
+ }
+}
+
+void
+UVMapView::SelectNone()
+{
+ selverts.clear();
+}
+
+void
+UVMapView::SelectInverse()
+{
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* p = iter.value();
+
+ if (p->material != material)
+ continue;
+
+ for (int i = 0; i < p->nverts; i++) {
+ WORD p_index = iter.index();
+ DWORD value = (p_index << 16) | i;
+
+ bool contains = false;
+ auto svi = selverts.begin();
+ for (; svi != selverts.end(); ++svi) {
+ if (*svi == value) {
+ contains = true;
+ break;
+ }
+ }
+
+ if (contains)
+ selverts.erase(svi);
+ else
+ selverts.push_back(value);
+ }
+ }
+}
+
+bool
+UVMapView::IsSelected(Poly* poly, WORD v)
+{
+ WORD p = polys.index(poly);
+ DWORD value = (p << 16) | v;
+
+ bool contains = false;
+
+ for (auto svi = selverts.begin(); svi != selverts.end(); ++svi) {
+ if (*svi == value)
+ return true;
+ }
+
+ return false;
+}
+
+bool
+UVMapView::WillSelect(CPoint& p)
+{
+ if (!material || !material->tex_diffuse)
+ return false;
+
+ Bitmap* bmp = material->tex_diffuse;
+ int w = bmp->Width();
+ int h = bmp->Height();
+
+ double cx = window->Width() / 2 + x_offset;
+ double cy = window->Height() / 2 + y_offset;
+
+ // find first selected vert:
+ ListIter<Poly> iter = polys;
+ while (++iter) {
+ Poly* poly = iter.value();
+ VertexSet* vset = poly->vertex_set;
+
+ for (int i = 0; i < poly->nverts; i++) {
+ int n1 = poly->verts[i];
+ double tu1 = vset->tu[n1];
+ double tv1 = vset->tv[n1];
+
+ int x1 = (int) (cx + zoom * w * (tu1-0.5));
+ int y1 = (int) (cy + zoom * h * (tv1-0.5));
+
+ int dx = abs(p.x - x1);
+ int dy = abs(p.y - y1);
+
+ if (dx < 4 && dy < 4) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}