X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fobject.cpp;h=09d52bf3357b02165410e82e4200877421eddb7e;hb=565c33c91ea355528145ba94b31b2e44309d0834;hp=ae20db6a8cf6a1706e4776c96a49ba43a367e74d;hpb=bd9b40058a376c946318a444dd6c77737ec6ac98;p=architektonas diff --git a/src/object.cpp b/src/object.cpp index ae20db6..09d52bf 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -5,7 +5,7 @@ // (C) 2011 Underground Software // See the README and GPLv3 files for licensing and warranty information // -// JLH = James L. Hammons +// JLH = James Hammons // // WHO WHEN WHAT // --- ---------- ------------------------------------------------------------ @@ -16,6 +16,8 @@ // #include "object.h" +#include +#include // Initialize static variables bool Object::fixedAngle = false; @@ -24,68 +26,236 @@ QFont * Object::font = 0; int Object::viewportHeight = 0; bool Object::deleteActive = false; bool Object::dimensionActive = false; +bool Object::snapToGrid = true; +//snapToPoints all well here? +bool Object::ignoreClicks = false; +bool Object::dontMove = false; +bool Object::selectionInProgress = false; +QRectF Object::selection; +double Object::gridSpacing; +int Object::currentLayer = 0; -Object::Object(): position(Vector(0, 0)), parent(0), state(OSInactive), oldState(OSInactive), - needUpdate(false), attachedDimension(0) +Object::Object(): position(Vector(0, 0)), parent(0), type(OTObject), + state(OSInactive), layer(0), oldState(OSInactive), needUpdate(false) + //, attachedDimension(0) { } -Object::Object(Vector v, Object * passedInParent/*= 0*/): position(v), parent(passedInParent), - state(OSInactive), oldState(OSInactive), needUpdate(false), attachedDimension(0) + +Object::Object(Vector v, Object * passedInParent/*= 0*/): position(v), + parent(passedInParent), state(OSInactive), layer(0), oldState(OSInactive), + needUpdate(false)//, attachedDimension(0) { } + Object::~Object() { +printf("Object: Destroyed!\n"); + for(uint i=0; iDisconnectAll(this); } + /*virtual*/ void Object::Draw(Painter *) { } + /*virtual*/ Vector Object::Center(void) { return Vector(); } + /*virtual*/ bool Object::Collided(Vector) { return false; } + /*virtual*/ void Object::PointerMoved(Vector) { } + /*virtual*/ void Object::PointerReleased(void) { } + /*virtual*/ bool Object::NeedsUpdate(void) { return needUpdate; } + +/*virtual*/ bool Object::HitTest(Point) +{ + return false; +} + + // This is intended to be overridden by the Container class, for object morphing /*virtual*/ void Object::Transmute(Object *, Object *) { } + /*virtual*/ Object * Object::GetParent(void) { return parent; } + /*virtual*/ void Object::Add(Object *) { } + +// This returns a pointer to the point passed in, if it coincides. Otherwise returns NULL. +/*virtual*/ Vector * Object::GetPointAt(Vector) +{ + return 0; +} + + +// This is meant for writing object data to a file. +/*virtual*/ void Object::Enumerate(FILE *) +{ +} + + +/*virtual*/ Object * Object::Copy(void) +{ + return new Object(position, parent); +} + + +// This returns a point on the object at 'parameter', which is between 0 and 1. +// Default is to return the object's position. +/*virtual*/ Vector Object::GetPointAtParameter(double) +{ + return position; +} + + +// Since these functions are pretty much non-object specific, we can implement +// them here. :-) +/*virtual*/ void Object::Connect(Object * obj, double parameter) +{ + // Check to see if this connection is already in our list... + Connection c(obj, parameter); + std::vector::iterator i; + + for(i=connected.begin(); i!=connected.end(); i++) + { + // Bail out if this connection is already present... + if (*i == c) + return; + } + + // Connection is a new one, add it in... + connected.push_back(c); +} + + +/*virtual*/ void Object::Disconnect(Object * obj, double parameter) +{ + std::vector::iterator i; + + for(i=connected.begin(); i!=connected.end(); i++) + { + if (((*i).object == obj) && ((*i).t == parameter)) + { + connected.erase(i); + return; + } + } +} + + +/*virtual*/ void Object::DisconnectAll(Object * obj) +{ + std::vector::iterator i; + + for(i=connected.begin(); i!=connected.end(); ) + { + if ((*i).object == obj) + connected.erase(i); + else + i++; + } +} + + +/*virtual*/ QRectF Object::Extents(void) +{ + // Generic object returns an empty rect... + return QRectF(); +} + + +#if 0 +/*virtual*/ ObjectType Object::Type(void) +{ + return OTObject; +} +#endif + + +/*virtual*/ void Object::Translate(Vector amount) +{ + position += amount; +} + + +/*virtual*/ void Object::Rotate(Point, double) +{ +} + + +/*virtual*/ void Object::Scale(Point, double) +{ +} + + +/*virtual*/ void Object::Mirror(Point, Point) +{ +} + + +/*virtual*/ void Object::Save(void) +{ + oldPosition = position; +} + + +/*virtual*/ void Object::Restore(void) +{ + position = oldPosition; +} + + ObjectState Object::GetState(void) { return state; } + +void Object::Reparent(Object * newParent) +{ + parent = newParent; +} + + +/*Dimension * Object::GetAttachedDimension(void) +{ + return attachedDimension; +}*/ + + // Class methods... void Object::SetFixedAngle(bool state/*= true*/) @@ -93,27 +263,60 @@ void Object::SetFixedAngle(bool state/*= true*/) fixedAngle = state; } + void Object::SetFixedLength(bool state/*= true*/) { fixedLength = state; } + void Object::SetFont(QFont * f) { font = f; } + void Object::SetViewportHeight(int height) { viewportHeight = height; } + void Object::SetDeleteActive(bool state/*= true*/) { deleteActive = state; } + void Object::SetDimensionActive(bool state/*= true*/) { dimensionActive = state; } + + +void Object::SetSnapMode(bool state/*= true*/) +{ + snapToGrid = state; +} + + +// +// This looks strange, but it's really quite simple: We want a point that's +// more than half-way to the next grid point to snap there while conversely we +// want a point that's less than half-way to to the next grid point then snap +// to the one before it. So we add half of the grid spacing to the point, then +// divide by it so that we can remove the fractional part, then multiply it +// back to get back to the correct answer. +// +Vector Object::SnapPointToGrid(Vector point) +{ + point += gridSpacing / 2.0; // *This* adds to Z!!! + point /= gridSpacing; + point.x = floor(point.x);//need to fix this for negative numbers... + point.y = floor(point.y); + point.z = 0; // Make *sure* Z doesn't go anywhere!!! + point *= gridSpacing; + return point; +} + +