/* Copyright 2014 ROBLOX Corporation, All Rights Reserved */ #pragma once #include "rbx/boost.hpp" #include #include #include "util/Extents.h" #include "v8tree/Instance.h" namespace RBX { class DataModel; class PartInstance; class PartOperation; class NegateOperation; class CSGMesh; typedef void (*MessageCallback)( const char* title, const char* msg ); class CSGOperations { public: CSGOperations( DataModel* pDatamodel, MessageCallback failedFun ); bool doUnion( Instances::const_iterator start, Instances::const_iterator end, boost::shared_ptr& partOperation ); bool doNegate( Instances::const_iterator start, Instances::const_iterator end, Instances& toSelect ); bool doSeparate( Instances::const_iterator start, Instances::const_iterator end, Instances& ungroupedItems ); private: DataModel* mDatamodel; MessageCallback operationFailed; bool setUnionMesh(boost::shared_ptr finalPartOperation, Instances::const_iterator start, Instances::const_iterator end, bool isChildRecalculation); bool setNegateMesh(shared_ptr negateOperation, shared_ptr instance ); bool recalculateMesh(shared_ptr partOperation); bool negateSelection(Instances& toRemove, Instances& toSelect, Instances::const_iterator start, Instances::const_iterator end); bool separate(const shared_ptr& wInstance, Instances& separatedItems, Instances& itemsToDelete); bool setOperationMesh(shared_ptr partOperation, Instances instances); bool createPartMesh(PartInstance* part, CSGMesh* modelData); void resetInstanceCFrame(Instances::const_iterator start, Instances::const_iterator end, boost::unordered_map, CoordinateFrame> originalCFrames); void warnIfChildInstances(shared_ptr partInstance, const std::string& operationType); Instance* getCommonParentOrWorkspace(Instances::const_iterator start, Instances::const_iterator end); static const char* unionFailedMsg; }; }