|
|
- /*
- * Copyright (C) 2017 Christopher J. Howard
- *
- * This file is part of Antkeeper Source Code.
- *
- * Antkeeper Source Code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Antkeeper Source Code is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
- */
-
- #ifndef NEST_HPP
- #define NEST_HPP
-
- #include <random>
- #include <vector>
- #include <emergent/emergent.hpp>
-
- using namespace Emergent;
-
- /**
- * General algorithm: Draw a series of lines straight down. Select multiple elevation levels on each line at which to create a chamber. Create helixes around lines. At the selected elevation levels on each line, create a corresponding chambers on the helixes at the same elevations, in the direction of the outside of the helix. Check for intersections between chambers and tunnels, and merge as necessary.
- */
-
- struct Chamber;
-
- /**
- * A vertically-directed helical shaft with one or more connected chambers.
- */
- struct Shaft
- {
- Chamber* parent; // The parent chamber from which this shaft begins
- std::vector<Chamber*> children; // A list of chambers which are formed from this shaft
- int generation; // The generation index of this shaft. The root shaft is gen 0, the shafts from its chambers are gen 1, and so on.
- Vector3 entrance; // Position of the entrance point of this shaft
- float shaftRadius; // Radius of the shaft
- float shaftDepth; // Total depth of this shaft
- float initialHelixAngle; // Angle at which the shaft helix begins
- float helixRadius; // Radius of the shaft helix
- float helixPitch; // Pitch of the shaft helix
-
- /**
- * Returns the position on the shaft's helix at the specified depth.
- *
- * @param depth Depth relative to the entrance of this shaft.
- * @return Point on the helix at the specified depth.
- */
- Vector3 getHelixPosition(float depth) const;
-
- /**
- * Returns the angle to the helix at the specified depth.
- *
- * @param depth Depth relative to the entrance of this shaft.
- * @return Angle to the helix at the specified depth.
- */
- float getHelixAngle(float depth) const;
- };
-
- /**
- * A horizontal annular chamber with one parent shaft and a max of one child shaft. Chambers always face toward the outside of the parent shaft's helix.
- */
- struct Chamber
- {
- Shaft* parent; // Parent shaft from which this chamber was formed
- Shaft* child; // Child shaft which begins in this chamber
- int generation; // The number of chambers from this chamber to the root shaft.
- float relativeDepth; // Depth from the entrance of the parent shaft to this chamber
- float absoluteDepth; // Depth from the entrance of the root shaft to this chamber
- float innerRadius; // Inner radius of the annulus
- float outerRadius; // Outer radius of the annulus
- float centralAngle; // Angle of the annular sector
- float height; // Height of the annular sector
- float childAngle; // The angle on the annulus at which the child shaft begins
- };
-
- /**
- * Describes the parameters required to generate a nest.
- */
- struct NestParameters
- {
- // Random params
- unsigned int randomSeed;
-
- // Shaft params
- int maxShaftGeneration;
- float minShaftRadius;
- float maxShaftRadius;
- float minShaftDepth;
- float maxShaftDepth;
- float minShaftHelixRadius;
- float maxShaftHelixRadius;
- float minShaftHelixPitch;
- float maxShaftHelixPitch;
- int minShaftChamberCount;
- int maxShaftChamberCount;
- float minShaftChamberPitch;
- float maxShaftChamberPitch;
-
- // Chamber params
- float minChamberInnerRadius;
- float maxChamberInnerRadius;
- float minChamberOuterRadius;
- float maxChamberOuterRadius;
- float minChamberCentralAngle;
- float maxChamberCentralAngle;
- };
-
- class Nest
- {
- public:
- Nest();
- ~Nest();
-
- /**
- * Generates the nest and all of its shafts and chambers.
- */
- void generate();
-
- /**
- * Sets the nest generation parameters.
- */
- void setParameters(const NestParameters& parameters);
-
- /**
- * Returns the nest generation parameters.
- */
- const NestParameters& getParameters() const;
-
- /**
- * Returns a pointer to the root shaft of the nest.
- */
- const Shaft* getRootShaft() const;
-
- private:
- /**
- * Recursive function which generates a connected system of shafts and chambers.
- *
- * @param parent Specifies the parent chamber of the shaft. A value of `nullptr` indicates the root shaft.
- * @param generation The index of the shaft's generation. The root shaft is generation 0, the shafts formed from the root shaft's chambers are generation 1, and so on.
- * @return The newly created shaft.
- */
- Shaft* dig(Chamber* parent) const;
-
- /**
- * Determines intersections between chambers and connects them.
- */
- void merge();
-
- /**
- * Creates a map (interconnected system of nodes) with which can be used to navigate the nest.
- */
- void map();
-
- /**
- * Recursive function which deletes a shaft and all of its connect chambers and subshafts.
- *
- * @param Specifies a shaft to delete.
- */
- void free(Shaft* shaft);
-
- float random(float min, float max) const;
- int random(int min, int max) const;
-
- NestParameters parameters;
- Shaft* root;
- mutable std::default_random_engine rng;
- };
-
- inline const Shaft* Nest::getRootShaft() const
- {
- return root;
- }
-
- #endif // NEST_HPP
|