Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
96 lines
2.2 KiB
C++
96 lines
2.2 KiB
C++
#ifndef SUBDIVISION_INCLUDED // -*- C++ -*-
|
|
#define SUBDIVISION_INCLUDED
|
|
|
|
#include "Quadedge.hpp"
|
|
|
|
class Subdivision;
|
|
|
|
class Triangle : public Labelled {
|
|
Edge *anchor;
|
|
Triangle *next_face;
|
|
|
|
public:
|
|
|
|
Triangle(Edge *e, int t=0)
|
|
{
|
|
token = t;
|
|
reshape(e);
|
|
}
|
|
|
|
Triangle *linkTo(Triangle *t) { next_face = t; return this; }
|
|
Triangle *getLink() { return next_face; }
|
|
Edge *getAnchor() { return anchor; }
|
|
void dontAnchor(Edge *e);
|
|
|
|
void reshape(Edge *e);
|
|
|
|
virtual void update(Subdivision&); // called to update stuff
|
|
|
|
const Vec2& point1() const { return anchor->Org(); }
|
|
const Vec2& point2() const { return anchor->Dest(); }
|
|
const Vec2& point3() const { return anchor->Lprev()->Org(); }
|
|
};
|
|
|
|
typedef void (*edge_callback)(Edge *, void *);
|
|
typedef void (*face_callback)(Triangle&, void *);
|
|
|
|
|
|
class Subdivision {
|
|
private:
|
|
Edge *startingEdge;
|
|
Triangle *first_face;
|
|
|
|
protected:
|
|
void initMesh(const Vec2&, const Vec2&, const Vec2&, const Vec2&);
|
|
Subdivision() { }
|
|
|
|
Edge *makeEdge();
|
|
Edge *makeEdge(Vec2& org, Vec2& dest);
|
|
|
|
virtual Triangle *allocFace(Edge *e);
|
|
Triangle& makeFace(Edge *e);
|
|
|
|
|
|
void deleteEdge(Edge *);
|
|
Edge *connect(Edge *a, Edge *b);
|
|
void swap(Edge *e);
|
|
|
|
//
|
|
// Some random functions
|
|
bool ccwBoundary(const Edge *e);
|
|
bool onEdge(const Vec2&, Edge *);
|
|
|
|
public:
|
|
|
|
Subdivision(Vec2& a, Vec2& b, Vec2& c, Vec2& d) { initMesh(a,b,c,d); }
|
|
|
|
//
|
|
// virtual functions for customization
|
|
virtual bool shouldSwap(const Vec2&, Edge *);
|
|
|
|
|
|
bool isInterior(Edge *);
|
|
|
|
Edge *spoke(Vec2&, Edge *e);
|
|
void optimize(Vec2&, Edge *);
|
|
|
|
Edge *locate(const Vec2& x) { return locate(x, startingEdge); }
|
|
Edge *locate(const Vec2&, Edge *hint);
|
|
Edge *insert(Vec2&, Triangle *t=NULL);
|
|
|
|
void overEdges(edge_callback, void *closure=NULL);
|
|
void overFaces(face_callback, void *closure=NULL);
|
|
};
|
|
|
|
|
|
#ifdef IOSTREAMH
|
|
inline ostream& operator<<(ostream& out, Triangle& t)
|
|
{
|
|
return out << "Triangle("<< t.point1() << " " << t.point2() << " "
|
|
<< t.point3() << ")";
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif
|