Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/describescreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,18 @@ void TextWindow::DescribeSelection() {
case Entity::Type::POINT_IN_2D:
case Entity::Type::POINT_N_TRANS:
case Entity::Type::POINT_N_ROT_TRANS:
case Entity::Type::POINT_N_ROT_AXIS_TRANS:
case Entity::Type::POINT_N_COPY:
case Entity::Type::POINT_N_ROT_AA:
case Entity::Type::POINT_N_MIRROR:
p = e->PointGetNum();
Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(p));
break;

case Entity::Type::NORMAL_IN_3D:
case Entity::Type::NORMAL_IN_2D:
case Entity::Type::NORMAL_N_COPY:
case Entity::Type::NORMAL_N_MIRROR:
case Entity::Type::NORMAL_N_ROT:
case Entity::Type::NORMAL_N_ROT_AA: {
Quaternion q = e->NormalGetNum();
Expand Down Expand Up @@ -171,6 +174,8 @@ void TextWindow::DescribeSelection() {
case Entity::Type::FACE_N_ROT_TRANS:
case Entity::Type::FACE_N_ROT_AA:
case Entity::Type::FACE_N_TRANS:
case Entity::Type::FACE_N_MIRROR:
case Entity::Type::FACE_N_COPY:
Printf(false, "%FtPLANE FACE%E");
p = e->FaceGetNormalNum();
Printf(true, " normal = " PT_AS_NUM, CO(p));
Expand Down
10 changes: 9 additions & 1 deletion src/drawentity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ void Entity::GetReferencePoints(std::vector<Vector> *refs) {
case Type::POINT_N_ROT_TRANS:
case Type::POINT_N_ROT_AA:
case Type::POINT_N_ROT_AXIS_TRANS:
case Type::POINT_N_MIRROR:
case Type::POINT_IN_3D:
case Type::POINT_IN_2D:
refs->push_back(PointGetDrawNum());
Expand All @@ -96,6 +97,7 @@ void Entity::GetReferencePoints(std::vector<Vector> *refs) {
case Type::NORMAL_N_ROT_AA:
case Type::NORMAL_IN_3D:
case Type::NORMAL_IN_2D:
case Type::NORMAL_N_MIRROR:
case Type::WORKPLANE:
case Type::CIRCLE:
case Type::ARC_OF_CIRCLE:
Expand All @@ -122,6 +124,8 @@ void Entity::GetReferencePoints(std::vector<Vector> *refs) {
case Type::FACE_N_ROT_AA:
case Type::FACE_ROT_NORMAL_PT:
case Type::FACE_N_ROT_AXIS_TRANS:
case Type::FACE_N_MIRROR:
case Type::FACE_N_COPY:
break;
}
}
Expand Down Expand Up @@ -549,7 +553,8 @@ void Entity::Draw(DrawAs how, Canvas *canvas) {
case Type::POINT_N_ROT_AA:
case Type::POINT_N_ROT_AXIS_TRANS:
case Type::POINT_IN_3D:
case Type::POINT_IN_2D: {
case Type::POINT_IN_2D:
case Type::POINT_N_MIRROR: {
if(how == DrawAs::HIDDEN) return;

// If we're analyzing the sketch to show the degrees of freedom,
Expand Down Expand Up @@ -594,6 +599,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) {
case Type::NORMAL_N_COPY:
case Type::NORMAL_N_ROT:
case Type::NORMAL_N_ROT_AA:
case Type::NORMAL_N_MIRROR:
case Type::NORMAL_IN_3D:
case Type::NORMAL_IN_2D: {
const Camera &camera = canvas->GetCamera();
Expand Down Expand Up @@ -831,6 +837,8 @@ void Entity::Draw(DrawAs how, Canvas *canvas) {
case Type::FACE_N_ROT_AA:
case Type::FACE_ROT_NORMAL_PT:
case Type::FACE_N_ROT_AXIS_TRANS:
case Type::FACE_N_MIRROR:
case Type::FACE_N_COPY:
// Do nothing; these are drawn with the triangle mesh
return;
}
Expand Down
81 changes: 79 additions & 2 deletions src/entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ bool EntityBase::IsPoint() const {
case Type::POINT_N_ROT_TRANS:
case Type::POINT_N_ROT_AA:
case Type::POINT_N_ROT_AXIS_TRANS:
case Type::POINT_N_MIRROR:
return true;

default:
Expand All @@ -260,6 +261,7 @@ bool EntityBase::IsNormal() const {
case Type::NORMAL_N_COPY:
case Type::NORMAL_N_ROT:
case Type::NORMAL_N_ROT_AA:
case Type::NORMAL_N_MIRROR:
return true;

default: return false;
Expand Down Expand Up @@ -293,6 +295,16 @@ Quaternion EntityBase::NormalGetNum() const {
q = q.Times(numNormal);
break;
}
case Type::NORMAL_N_MIRROR: {
Vector orig = numNormal.RotationN().WithMagnitude(1.0);
Vector n = Vector::From(
SK.GetParam(param[0])->val,
SK.GetParam(param[1])->val,
SK.GetParam(param[2])->val);
Vector cp = orig.Cross(n);
q = numNormal.Times(Quaternion::From(n.Dot(orig), cp.x, cp.y, cp.z));
break;
}

default: ssassert(false, "Unexpected entity type");
}
Expand Down Expand Up @@ -323,6 +335,7 @@ void EntityBase::NormalForceTo(Quaternion q) {
}

case Type::NORMAL_N_ROT_AA:
case Type::NORMAL_N_MIRROR:
// Not sure if I'll bother implementing this one
break;

Expand Down Expand Up @@ -382,6 +395,18 @@ ExprQuaternion EntityBase::NormalGetExprs() const {
break;
}

case Type::NORMAL_N_MIRROR: {
ExprVector orig = ExprVector::From(numNormal.RotationN().WithMagnitude(1.0));
ExprVector n = ExprVector::From(
Expr::From(param[0]),
Expr::From(param[1]),
Expr::From(param[2]));
ExprVector cp = orig.Cross(n);
q = ExprQuaternion::From(numNormal).Times(ExprQuaternion::From(
n.Dot(orig), cp.x, cp.y, cp.z));
break;
}

default: ssassert(false, "Unexpected entity type");
}
return q;
Expand Down Expand Up @@ -420,6 +445,15 @@ void EntityBase::PointForceTo(Vector p) {
break;
}

case Type::POINT_N_MIRROR: {
Vector trans = p.Minus(numPoint).WithMagnitude(1.0);
SK.GetParam(param[0])->val = trans.x;
SK.GetParam(param[1])->val = trans.y;
SK.GetParam(param[2])->val = trans.z;
SK.GetParam(param[3])->val = p.Plus(numPoint).ScaledBy(0.5).Dot(trans);
break;
}

case Type::POINT_N_TRANS: {
if(timesApplied == 0) break;
Vector trans = (p.Minus(numPoint)).ScaledBy(1.0/timesApplied);
Expand Down Expand Up @@ -512,6 +546,13 @@ Vector EntityBase::PointGetNum() const {
break;
}

case Type::POINT_N_MIRROR: {
Vector norm = Vector::From(param[0], param[1], param[2]);
double dist = SK.GetParam(param[3])->val;
p = numPoint.Plus(norm.ScaledBy(dist*2 - 2*numPoint.Dot(norm)));
break;
}

case Type::POINT_N_TRANS: {
Vector trans = Vector::From(param[0], param[1], param[2]);
p = numPoint.Plus(trans.ScaledBy(timesApplied));
Expand Down Expand Up @@ -571,6 +612,14 @@ ExprVector EntityBase::PointGetExprs() const {
r = r.Plus(v.ScaledBy(Expr::From(param[1])));
break;
}
case Type::POINT_N_MIRROR:{
ExprVector orig = ExprVector::From(numPoint);
ExprVector norm = ExprVector::From(param[0], param[1], param[2]);
Expr *dist = Expr::From(param[3]);
r = orig.Plus(norm.ScaledBy(
dist->Minus(orig.Dot(norm))->Times(Expr::From(2.0))));
break;
}
case Type::POINT_N_TRANS: {
ExprVector orig = ExprVector::From(numPoint);
ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
Expand Down Expand Up @@ -703,6 +752,8 @@ bool EntityBase::IsFace() const {
case Type::FACE_N_ROT_AA:
case Type::FACE_ROT_NORMAL_PT:
case Type::FACE_N_ROT_AXIS_TRANS:
case Type::FACE_N_MIRROR:
case Type::FACE_N_COPY:
return true;
default:
return false;
Expand All @@ -711,9 +762,15 @@ bool EntityBase::IsFace() const {

ExprVector EntityBase::FaceGetNormalExprs() const {
ExprVector r;
if(type == Type::FACE_NORMAL_PT) {
if(type == Type::FACE_NORMAL_PT || type == Type::FACE_N_COPY) {
Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
r = ExprVector::From(v.WithMagnitude(1));
} else if(type == Type::FACE_N_MIRROR) {
Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz).ScaledBy(-1.0);
r = ExprVector::From(v.WithMagnitude(1));
ExprQuaternion q = ExprQuaternion::From( Expr::From(0.0),
Expr::From(param[0]), Expr::From(param[1]), Expr::From(param[2]) );
r = q.Rotate(r);
} else if(type == Type::FACE_XPROD) {
ExprVector vc = ExprVector::From(param[0], param[1], param[2]);
ExprVector vn =
Expand All @@ -740,8 +797,16 @@ ExprVector EntityBase::FaceGetNormalExprs() const {

Vector EntityBase::FaceGetNormalNum() const {
Vector r;
if(type == Type::FACE_NORMAL_PT) {
if(type == Type::FACE_NORMAL_PT || type == Type::FACE_N_COPY) {
r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
} else if(type == Type::FACE_N_MIRROR) {
r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz)
.ScaledBy(-1.0).WithMagnitude(1.0);
Quaternion q = Quaternion::From(0.0,
SK.GetParam(param[0])->val,
SK.GetParam(param[1])->val,
SK.GetParam(param[2])->val);
r = q.Rotate(r);
} else if(type == Type::FACE_XPROD) {
Vector vc = Vector::From(param[0], param[1], param[2]);
Vector vn = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
Expand All @@ -765,6 +830,11 @@ ExprVector EntityBase::FaceGetPointExprs() const {
ExprVector r;
if((type == Type::FACE_NORMAL_PT) || (type==Type::FACE_ROT_NORMAL_PT)) {
r = SK.GetEntity(point[0])->PointGetExprs();
} else if(type == Type::FACE_N_MIRROR) {
// TODO: figure this out, when is it even used?
r = ExprVector::From(numPoint);
} else if(type == Type::FACE_N_COPY) {
r = ExprVector::From(numPoint);
} else if(type == Type::FACE_XPROD) {
r = ExprVector::From(numPoint);
} else if(type == Type::FACE_N_ROT_TRANS) {
Expand Down Expand Up @@ -803,6 +873,13 @@ Vector EntityBase::FaceGetPointNum() const {
Vector r;
if((type == Type::FACE_NORMAL_PT) || (type==Type::FACE_ROT_NORMAL_PT)) {
r = SK.GetEntity(point[0])->PointGetNum();
} else if(type == Type::FACE_N_COPY) {
r = numPoint;
} else if(type == Type::FACE_N_MIRROR) {
Vector norm = Vector::From(param[0], param[1], param[2]);
double dist = SK.GetParam(param[3])->val;
Vector p = numPoint;
r = p.Plus(norm.ScaledBy(dist*2 - 2*p.Dot(norm)));
} else if(type == Type::FACE_XPROD) {
r = numPoint;
} else if(type == Type::FACE_N_ROT_TRANS) {
Expand Down
1 change: 1 addition & 0 deletions src/graphicswin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ const MenuEntry Menu[] = {
{ 1, N_("&Helix"), Command::GROUP_HELIX, S|'h', KN, mGrp },
{ 1, N_("&Lathe"), Command::GROUP_LATHE, S|'l', KN, mGrp },
{ 1, N_("Re&volve"), Command::GROUP_REVOLVE, S|'v', KN, mGrp },
{ 1, N_("&Mirror"), Command::GROUP_MIRROR , S|'m', KN, mGrp },
{ 1, NULL, Command::NONE, 0, KN, NULL },
{ 1, N_("Link / Assemble..."), Command::GROUP_LINK, S|'i', KN, mGrp },
{ 1, N_("Link Recent"), Command::GROUP_RECENT, 0, KN, mGrp },
Expand Down
Loading