43 lines
1.8 KiB
C++
43 lines
1.8 KiB
C++
#pragma once
|
|
#include "FluidSim/AudioProcessing.hpp"
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace fluidsim::port {
|
|
struct EngineConfig;
|
|
struct ExhaustConfig;
|
|
struct JunctionConfig;
|
|
struct TwoStrokeConfig;
|
|
struct GeometryPath {
|
|
bool operator==(const GeometryPath&) const = default;
|
|
std::vector<Vec3> points;
|
|
float length() const;
|
|
Vec3 position(float distance) const;
|
|
};
|
|
struct GeometryBox {
|
|
bool operator==(const GeometryBox&) const = default;
|
|
Vec3 center{},size{};
|
|
float volume() const {return size.x*size.y*size.z;}
|
|
Vec3 minimum() const {return {center.x-size.x*.5f,center.y-size.y*.5f,center.z-size.z*.5f};}
|
|
Vec3 maximum() const {return {center.x+size.x*.5f,center.y+size.y*.5f,center.z+size.z*.5f};}
|
|
};
|
|
struct GeometryVolume {std::string id;GeometryBox box;bool operator==(const GeometryVolume&) const = default;};
|
|
struct CylinderPlacement {Vec3 origin{};float tilt_degrees{};bool operator==(const CylinderPlacement&) const = default;};
|
|
struct PhysicalGeometry {
|
|
bool operator==(const PhysicalGeometry&) const = default;
|
|
std::vector<GeometryPath> pipes;
|
|
std::vector<GeometryVolume> volumes;
|
|
std::vector<CylinderPlacement> cylinders;
|
|
const GeometryBox* volume(const std::string& id) const;
|
|
GeometryBox* volume(const std::string& id);
|
|
bool empty() const {return pipes.empty();}
|
|
};
|
|
float geometry_distance(Vec3 a,Vec3 b);
|
|
Vec3 cylinder_point(const CylinderPlacement& cylinder,Vec3 local);
|
|
PhysicalGeometry default_geometry(const EngineConfig&,const ExhaustConfig&,const JunctionConfig&);
|
|
PhysicalGeometry default_geometry(const TwoStrokeConfig&);
|
|
EngineConfig resolve_engine_geometry(EngineConfig,const ExhaustConfig&,const JunctionConfig&);
|
|
TwoStrokeConfig resolve_two_stroke_geometry(TwoStrokeConfig);
|
|
void validate_geometry(const PhysicalGeometry&,std::size_t pipes,std::size_t cylinders);
|
|
}
|