cakefoot/src/Curve.hpp
Cocktail Frank 97023ae273 Check for Batter Up and Icing achievements
Add stray timer and stray value to count seconds the player is able to
keep the character in place for Batter Up achievements. Also add a stat
for tracking the stray value, and two new Batter Up achievements for
staying in place longer.

Added a distance_float function which removes the unnecessary step of
converting the distance to int and deprecated the older distance
function.

Make Character::speed public data by adding an accessor function.
2024-11-14 14:56:28 -05:00

81 lines
2.5 KiB
C++

#pragma once
#include <vector>
#include "glm/glm.hpp"
#include "Attributes.hpp"
#include "math.hpp"
#include "extension.hpp"
class Curve
{
public:
float aspect;
std::vector<glm::vec3> unwrapped;
std::vector<sb::Attributes> position;
sb::Attributes color;
Curve (float aspect) : aspect(aspect) {}
/*!
* Add a vector of vertices to the curve. The vertices do not have to be wrapped to the screen space.
*
* The vertices will be stored both as the original vertices passed and as sb::Attributes wrapped to screen space if necessary.
*
* @vertices vector of vertices to add to curve
*/
void add(const std::vector<glm::vec3>& vertices);
/*!
* @return number of vertices in the unwrapped curve
*/
int length() const;
/*!
* @return the first point of the unwrapped curve
*/
const glm::vec3& front() const;
/*!
* @return size in bytes of the GL vertex data
*/
std::size_t size() const;
/*!
* @param index index of the vertex in the unwrapped curve vertices list
* @return vertex in the unwrapped vertices list at index
*/
glm::vec3 operator[](int index) const;
/*!
* Get the index of the curve at the relative position, where 0 is the beginning of the curve, and 1 is the end. The
* position can be outside of the range 0 - 1, in which case it will be wrapped to between 0 and 1.
*
* The returned index can be used with Curve::operator[](int) to get the vertex at the relative position.
*
* @param relative position between 0 and 1 relative to the ends of the curve
* @return curve index at position
*/
int index(float relative) const;
/*!
* Get the vertex at the given relative position on the curve, where 0 is the beginning of the curve, and 1 is the
* end. The position can be outside of the range 0 - 1, in which case it will be wrapped to between 0 and 1.
*
* This is a shortcut to using Curve::index(float) with Curve::operator[](int)
*
* @param relative position between 0 and 1 relative to the ends of the curve
* @return vertex value at position
*/
glm::vec3 relative(float relative) const;
/*!
* Wrap a vertex into this curve's space. The vertex doesn't need to be along the curve.
*
* @param vertex vertex in world space to wrap into the curve's world space
* @return wrapped vertex
*/
glm::vec3 wrap(const glm::vec3& vertex) const;
};