|
AGL
A graphics library
|
Base class for indexed triangle meshes. More...
#include <triangle_mesh.h>
Public Member Functions | |
| virtual void | render () const |
| Draw this mesh. More... | |
Public Member Functions inherited from agl::Mesh | |
| GLuint | vao () const |
| Return the vertex array object corresponding to this mesh. | |
| bool | hasUV () const |
| Return whether this mesh has UV coordinates defined. | |
| bool | isDynamic () const |
| Query whether or not this is a dynamic mesh. More... | |
Protected Member Functions | |
| void | initBuffers (std::vector< GLuint > *indices, std::vector< GLfloat > *points, std::vector< GLfloat > *normals, std::vector< GLfloat > *texCoords=nullptr, std::vector< GLfloat > *tangents=nullptr) |
| Call initBuffers from init() to set the data for this mesh. More... | |
Protected Member Functions inherited from agl::Mesh | |
| int | numVertices () const |
| Get the number of vertices. | |
| void | setVertexData (VertexAttribute type, int vertexId, const glm::vec4 &data) |
| Set vertex properties. More... | |
| glm::vec4 | vertexData (VertexAttribute type, int vertexId) const |
| Get vertex properties. More... | |
| virtual void | setIsDynamic (bool on) |
| Set whether or not this is a dynamic mesh. More... | |
| virtual void | init ()=0 |
| Override init to specifiy vertex data for the mesh. More... | |
| void | initBuffers (std::vector< GLfloat > *points, std::vector< GLfloat > *normals, std::vector< GLfloat > *texCoords=nullptr, std::vector< GLfloat > *tangents=nullptr) |
| Call initBuffers from init() to set the data for this mesh. More... | |
| virtual void | deleteBuffers () |
Protected Attributes | |
| GLuint | _nIndices = 0 |
Protected Attributes inherited from agl::Mesh | |
| GLuint | _nVerts = 0 |
| GLuint | _vao = 0 |
| bool | _hasUV = false |
| bool | _isDynamic = false |
| bool | _initialized = false |
| std::vector< GLuint > | _buffers |
| std::vector< GLfloat > | _data [5] |
Additional Inherited Members | |
Protected Types inherited from agl::Mesh | |
| enum | VertexAttribute { INDEX = 0, POSITION, NORMAL, UV, TANGENT, NUM_ATTRIBUTES } |
Base class for indexed triangle meshes.
Override this class to create your own meshes.
// Copyright 2020, Savvy Sine, Aline Normoyle
#include "agl/window.h"
#include "agl/mesh/plane.h"
using glm::vec2;
using glm::vec4;
using glm::vec3;
class UndulateMesh : public agl::Plane {
public:
UndulateMesh(int xsize, int ysize) : Plane(1, 1, xsize, ysize) {
setIsDynamic(true);
init(); // initialize the mesh rather than wait for first frame
}
void update(float elapsedTime) {
for (int i = 0; i < numVertices(); i++) {
vec3 p = vec3(vertexData(POSITION, i));
setVertexData(POSITION, i, vec4(position(p, elapsedTime), 0));
setVertexData(NORMAL, i, vec4(normal(p, elapsedTime), 0));
}
}
vec3 position(const vec3& p, float t) {
float angle = t;
float frequency = 7.0;
float amplitude = 0.05;
float heightFn = (angle + frequency * p[0] * frequency * p[2]);
float y = amplitude * sin(heightFn);
return vec3(p.x, y, p.z);
}
vec3 normal(const vec3& p, float t) {
float eps = 0.001;
vec3 x = position(p+vec3(eps, 0, 0), t) - position(p-vec3(eps, 0, 0), t);
vec3 z = position(p+vec3(0, 0, eps), t) - position(p-vec3(0, 0, eps), t);
vec3 y = glm::cross(z, x);
return normalize(y);
}
};
class MyWindow : public agl::Window {
public:
void setup() {
perspective(glm::radians(30.0), 1, 0.1, 100);
renderer.setUniform("Material.specular", vec3(1.0, 0.2, 0.8));
renderer.setUniform("Material.ambient", vec3(0.3, 0.0, 0.2));
}
void draw() {
_mesh.update(elapsedTime());
renderer.rotate(kPI * 0.2, vec3(1, 0, 0));
renderer.mesh(_mesh);
}
UndulateMesh _mesh = UndulateMesh(100, 100);
};
int main() {
MyWindow window;
window.run();
}
|
protected |
Call initBuffers from init() to set the data for this mesh.
|
virtual |