#pragma once #include #include #include #include "datatypes/cframe.h" #include "datatypes/color3.h" #include "datatypes/vector.h" #include "objects/base/instance.h" #include "rendering/surface.h" #include #include #include #include "annotation.h" namespace rp = reactphysics3d; // For easy construction from C++. Maybe should be removed? struct PartConstructParams { glm::vec3 position; glm::vec3 rotation; glm::vec3 size; Color3 color; bool anchored = false; bool locked = false; }; class Snap; class INSTANCE Part : public Instance { protected: // Joints where this part is Part0 std::vector> primaryJoints; // Joints where this part is Part1 std::vector> secondaryJoints; void trackJoint(std::shared_ptr); void untrackJoint(std::shared_ptr); SurfaceType surfaceFromFace(NormalId); bool checkJointContinuity(std::shared_ptr); bool checkJointContinuityUp(std::shared_ptr); bool checkJointContinuityDown(std::shared_ptr); friend JointInstance; void OnAncestryChanged(std::optional> child, std::optional> newParent) override; void onUpdated(std::string); public: const static InstanceType TYPE; Vector3 velocity; CFrame cframe; [[ def_prop(name="Size") ]] glm::vec3 size; [[ def_prop(name="Color") ]] Color3 color; [[ def_prop(name="Transparency") ]] float transparency = 0.f; bool selected = false; bool anchored = false; bool locked = false; rp::RigidBody* rigidBody = nullptr; SurfaceType topSurface = SurfaceType::SurfaceStuds; SurfaceType bottomSurface = SurfaceType::SurfaceInlets; SurfaceType leftSurface = SurfaceType::SurfaceSmooth; SurfaceType rightSurface = SurfaceType::SurfaceSmooth; SurfaceType frontSurface = SurfaceType::SurfaceSmooth; SurfaceType backSurface = SurfaceType::SurfaceSmooth; Part(); Part(PartConstructParams params); ~Part() override; static inline std::shared_ptr New() { return std::make_shared(); }; static inline std::shared_ptr New(PartConstructParams params) { return std::make_shared(params); }; static inline InstanceRef CreateGeneric() { return std::make_shared(); }; virtual const InstanceType* GetClass() override; inline Vector3 position() { return cframe.Position(); } void MakeJoints(); void BreakJoints(); // Calculate size of axis-aligned bounding box Vector3 GetAABB(); };