/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */ #pragma once #include "V8Tree/Instance.h" #include "V8Tree/Service.h" #include "V8World/World.h" #include "V8DataModel/JointInstance.h" #include "V8DataModel/PVInstance.h" #include "GfxBase/IAdornable.h" #include "Util/ConcurrencyValidator.h" #include #include "V8DataModel/ManualJointHelper.h" namespace RBX { class IAdornableCollector; extern const char *const sJointsService; class JointsService : public DescribedNonCreatable , public Service { private: typedef DescribedNonCreatable Super; ConcurrencyValidator concurrencyValidator; rbx::signals::scoped_connection postInertJointConnection; rbx::signals::scoped_connection postDestroyJointConnection; rbx::signals::scoped_connection autoJoinConnection; rbx::signals::scoped_connection autoDestroyConnection; ////////////////////////////////////// // Instance // /*override*/ void onDescendantAdded(Instance* instance); /*override*/ void onDescendantRemoving(const shared_ptr& instance); /*override*/ bool askAddChild(const Instance* instance) const { return Instance::fastDynamicCast(instance)!=NULL; } /*override*/ void onServiceProvider(ServiceProvider* oldProvider, ServiceProvider* newProvider); void onPostInsertJoint(Joint* joint, Primitive* unGroundedPrim, std::vector& combiRoots); void onPostRemoveJoint(Joint* joint, std::vector& prim0Roots, std::vector& prim1Roots); void onAutoJoin(Joint* joint); void onAutoDestroy(Joint* joint); boost::shared_ptr adornableCollector; ManualJointHelper manualJointHelper; boost::shared_ptr joinAfterMoveInstance; boost::shared_ptr joinAfterMoveTarget; public: World* world; JointsService(); void setJoinAfterMoveInstance(shared_ptr value); void setJoinAfterMoveTarget(shared_ptr value); void showPermissibleJoints(void); void createJoinAfterMoveJoints(void); void clearJoinAfterMoveJoints(void); }; } // namespace