1#include "ExtrusionGenerator.h"
8 if (!vertices || !numSegments || !crossSectionElements || !numSections || !rotations)
return false;
12 for (
int i = 0; i < numSections; i++) {
13 for (
int j = 0; j < numSegments; j++) {
14 vertices[index++] = rotations[i] * crossSectionElements[j];
23 const glm::vec3 * crossSectionElements,
24 const glm::vec3 * crossSectionElements2,
27 const glm::quat * rotations)
29 if (!vertices || !numSegments || !crossSectionElements || !numSections || !rotations)
return false;
33 for (
int i = 0; i < numSections; i++) {
34 for (
int j = 0; j < numSegments; j++) {
35 vertices[index++] = rotations[i] * (crossSectionElements[j] * (1.0f - morphs[i]) + crossSectionElements2[j] * morphs[i]);
47 for (
int i = 0; i < numVertices; ++i) {
48 normals[i] = vertices[i];
49 normals[i] = glm::normalize(normals[i]);
60 for (
int i = 0; i < numSections; i++) {
61 for (
int j = 0; j < numSegments; j++) {
62 vertices[index] = vertices[index] + positions[i];
76 for (
int i = 0; i < numSections; ++i) {
77 uint32_t color = colorValues[i];
79 for (
int j = 0; j < numSegments; ++j) {
80 colors[index++] = color;
92 for (
int i = 0; i < numSections; i++) {
93 for (
int j = 0; j < numSegments; j++) {
94 vertices[index++] *= values[i * stride];
106 for (
int i = 0; i < numVertices; i++) {
107 vertices[index++] *= values[i];
118 if (closed && !useTexture) {
119 for (
int i = offset; i < offset + numSections - 1; i++) {
120 for (
int j = 0; j < numSegments - 1; j++) {
121 indices[index++] = (i * numSegments) + j;
122 indices[index++] = (i * numSegments) + j + 1;
123 indices[index++] = ((i + 1) * numSegments) + j + 1;
124 indices[index++] = -1;
126 indices[index++] = (i * numSegments) + j;
127 indices[index++] = ((i + 1) * numSegments) + j + 1;
128 indices[index++] = ((i + 1) * numSegments) + j;
129 indices[index++] = -1;
132 indices[index++] = (i * numSegments) + numSegments - 1;
133 indices[index++] = (i * numSegments);
134 indices[index++] = ((i + 1) * numSegments);
135 indices[index++] = -1;
137 indices[index++] = (i * numSegments) + numSegments - 1;
138 indices[index++] = ((i + 1) * numSegments);
139 indices[index++] = ((i + 1) * numSegments) + numSegments - 1;
140 indices[index++] = -1;
143 for (
int i = offset; i < offset + numSections - 1; i++) {
144 for (
int j = 0; j < numSegments - 1; j++) {
145 indices[index++] = (i * numSegments) + j;
146 indices[index++] = (i * numSegments) + j + 1;
147 indices[index++] = ((i + 1) * numSegments) + j + 1;
148 indices[index++] = -1;
150 indices[index++] = (i * numSegments) + j;
151 indices[index++] = ((i + 1) * numSegments) + j + 1;
152 indices[index++] = ((i + 1) * numSegments) + j;
153 indices[index++] = -1;
166 if (closed && !useTexture) {
167 for (
int i = offset; i < offset + numSections - 1; i++) {
168 for (
int j = 0; j < numSegments - 1; j++) {
169 indices[index++] = (i * numSegments) + j;
170 indices[index++] = (i * numSegments) + j + 1;
171 indices[index++] = ((i + 1) * numSegments) + j + 1;
173 indices[index++] = (i * numSegments) + j;
174 indices[index++] = ((i + 1) * numSegments) + j + 1;
175 indices[index++] = ((i + 1) * numSegments) + j;
178 indices[index++] = (i * numSegments) + numSegments - 1;
179 indices[index++] = (i * numSegments);
180 indices[index++] = ((i + 1) * numSegments);
182 indices[index++] = (i * numSegments) + numSegments - 1;
183 indices[index++] = ((i + 1) * numSegments);
184 indices[index++] = ((i + 1) * numSegments) + numSegments - 1;
187 for (
int i = offset; i < offset + numSections - 1; i++) {
188 for (
int j = 0; j < numSegments - 1; j++) {
189 indices[index++] = (i * numSegments) + j;
190 indices[index++] = (i * numSegments) + j + 1;
191 indices[index++] = ((i + 1) * numSegments) + j + 1;
193 indices[index++] = (i * numSegments) + j;
194 indices[index++] = ((i + 1) * numSegments) + j + 1;
195 indices[index++] = ((i + 1) * numSegments) + j;
202Cogs::Geometry::ExtrusionGenerator::generateDepthBasedTextureCoordinates(
const size_t pathLength,
const size_t numSegments,
const float * depths,
const float * offsets,
const size_t offsetStride, glm::vec2 * texCoords)
204 for (
size_t i = 0; i < pathLength; i++) {
205 float v = depths[i] + offsets[i * offsetStride];
207 for (
size_t j = 0; j < numSegments; j++) {
208 float u =
static_cast<float>(j) / (numSegments - 1);
210 texCoords[i * numSegments + j] = glm::vec2(u, v);
static void offsetCrossSections(glm::vec3 *vertices, int numSections, int numSegments, const glm::vec3 *positions)
Offset vertices with per section positions.
static bool generateCrossSections(glm::vec3 *vertices, int numSections, const glm::vec3 *crossSectionElements, int numSegments, const glm::quat *rotations)
Generates cross section vertices in vertices from the cross section definition given.
static void modulateVertices(glm::vec3 *vertices, int numVertices, float *values)
Modulate extrusion vertices with per vertex data.
static void modulateSections(glm::vec3 *vertices, const int numSections, const int numSegments, const float *values, const size_t stride=1)
Modulate extrusion vertices with per section data.
static void colorSections(uint32_t *colors, int numSections, int numSegments, uint32_t *colorValues)
Generate color data per vertex from per section data.
static void generateSimpleExtrusionNormals(glm::vec3 *vertices, glm::vec3 *normals, int numVertices)
Generates extrusion normals from the vertices given.
static void generateTriangleIndices(int32_t *indices, int numSections, int numSegments, bool closed, bool useTexture, int32_t offset=0)
Generate legacy triangle extrusion indices.