#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 [[ def_inst(explorer_icon="part") ]] Part : public Instance { AUTOGEN_PREAMBLE 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; [[ def_prop(name="cframe"), cframe_position_prop(name="Position"), cframe_rotation_prop(name="Rotation") ]] CFrame cframe; [[ def_prop(name="Size", category=PART) ]] glm::vec3 size; [[ def_prop(name="Color", category=APPEARANCE) ]] Color3 color; [[ def_prop(name="Transparency", category=APPEARANCE) ]] float transparency = 0.f; bool selected = false; [[ def_prop(name="Anchored", category=BEHAVIOR) ]] bool anchored = false; [[ def_prop(name="Locked", category=BEHAVIOR) ]] bool locked = false; rp::RigidBody* rigidBody = nullptr; [[ def_prop(name="TopSurface", category=SURFACE) ]] SurfaceType topSurface = SurfaceType::SurfaceStuds; [[ def_prop(name="BottomSurface", category=SURFACE) ]] SurfaceType bottomSurface = SurfaceType::SurfaceInlets; [[ def_prop(name="LeftSurface", category=SURFACE) ]] SurfaceType leftSurface = SurfaceType::SurfaceSmooth; [[ def_prop(name="RightSurface", category=SURFACE) ]] SurfaceType rightSurface = SurfaceType::SurfaceSmooth; [[ def_prop(name="FrontSurface", category=SURFACE) ]] SurfaceType frontSurface = SurfaceType::SurfaceSmooth; [[ def_prop(name="BackSurface", category=SURFACE) ]] 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(); };