#pragma once #include #include "collision/SpecialPresetNames.h" #include "collision/SurfaceTerrains.h" namespace SM64 { struct CollisionVertex { int16_t x; int16_t y; int16_t z; CollisionVertex(int16_t x, int16_t y, int16_t z) : x(x), y(y), z(z) {}; }; struct CollisionTri { int16_t x; int16_t y; int16_t z; int16_t force; CollisionTri(int16_t x, int16_t y, int16_t z, int16_t force) : x(x), y(y), z(z), force(force) {}; }; struct CollisionSurface { SurfaceType surfaceType; std::vector tris; CollisionSurface(SurfaceType surfaceType, std::vector tris) : surfaceType(surfaceType), tris(std::move(tris)) {}; }; struct SpecialObject { SpecialPresets presetId; int16_t x; int16_t y; int16_t z; std::vector extraParams; // e.g. y-rot SpecialObject(SpecialPresets presetId, int16_t x, int16_t y, int16_t z, std::vector extraParams) : presetId(presetId), x(x), y(y), z(z), extraParams(std::move(extraParams)) {}; }; struct EnvRegionBox { int16_t id; int16_t x1; int16_t z1; int16_t x2; int16_t z2; int16_t height; EnvRegionBox(int16_t id, int16_t x1, int16_t z1, int16_t x2, int16_t z2, int16_t height) : id(id), x1(x1), z1(z1), x2(x2), z2(z2), height(height) {}; }; // e.g. water-box class Collision : public IParsedData { public: std::vector mVertices; std::vector mSurfaces; std::vector mSpecialObjects; std::vector mEnvRegionBoxes; explicit Collision(std::vector vertices, std::vector surfaces, std::vector specialObjects, std::vector envRegionBoxes) : mVertices(std::move(vertices)), mSurfaces(std::move(surfaces)), mSpecialObjects(std::move(specialObjects)), mEnvRegionBoxes(std::move(envRegionBoxes)) {} }; class CollisionCodeExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class CollisionHeaderExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class CollisionBinaryExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; class CollisionFactory : public BaseFactory { public: bool CanPreviewCode() override { return true; } std::optional> parse(std::vector& buffer, YAML::Node& data) override; std::unordered_map> GetExporters() override { return { REGISTER(Header, CollisionHeaderExporter) REGISTER(Binary, CollisionBinaryExporter) REGISTER(Code, CollisionCodeExporter) }; } }; #ifdef BUILD_UI // Previews the collision mesh, colored per surface type with baked shading. class CollisionFactoryUI : public BaseFactoryUI { public: float GetItemHeight(const ParseResultData& data) override; void DrawUI(const ParseResultData& data) override; }; #endif }