You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.7 KiB
89 lines
2.7 KiB
4 months ago
|
//
|
||
|
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
//
|
||
|
|
||
|
// Based on CubeMapActivity.java from The Android Open Source Project ApiDemos
|
||
|
// https://android.googlesource.com/platform/development/+/refs/heads/master/samples/ApiDemos/src/com/example/android/apis/graphics/CubeMapActivity.java
|
||
|
|
||
|
#ifndef SAMPLE_TORUS_LIGHTING_H_
|
||
|
#define SAMPLE_TORUS_LIGHTING_H_
|
||
|
|
||
|
#include <cmath>
|
||
|
|
||
|
const float kPi = 3.1415926535897f;
|
||
|
const GLushort kSize = 60;
|
||
|
|
||
|
void GenerateTorus(GLuint *vertexBuffer, GLuint *indexBuffer, GLsizei *indexCount)
|
||
|
{
|
||
|
std::vector<GLushort> indices;
|
||
|
for (GLushort y = 0; y < kSize; y++)
|
||
|
{
|
||
|
for (GLushort x = 0; x < kSize; x++)
|
||
|
{
|
||
|
GLushort a = y * (kSize + 1) + x;
|
||
|
GLushort b = y * (kSize + 1) + x + 1;
|
||
|
GLushort c = (y + 1) * (kSize + 1) + x;
|
||
|
GLushort d = (y + 1) * (kSize + 1) + x + 1;
|
||
|
|
||
|
indices.push_back(a);
|
||
|
indices.push_back(c);
|
||
|
indices.push_back(b);
|
||
|
|
||
|
indices.push_back(b);
|
||
|
indices.push_back(c);
|
||
|
indices.push_back(d);
|
||
|
}
|
||
|
}
|
||
|
*indexCount = static_cast<GLsizei>(indices.size());
|
||
|
|
||
|
std::vector<GLfloat> vertices;
|
||
|
for (uint32_t j = 0; j <= kSize; j++)
|
||
|
{
|
||
|
float angleV = kPi * 2 * j / kSize;
|
||
|
float cosV = cosf(angleV);
|
||
|
float sinV = sinf(angleV);
|
||
|
for (uint32_t i = 0; i <= kSize; i++)
|
||
|
{
|
||
|
float angleU = kPi * 2 * i / kSize;
|
||
|
float cosU = cosf(angleU);
|
||
|
float sinU = sinf(angleU);
|
||
|
float d = 3.0f + 0.75f * cosU;
|
||
|
|
||
|
float x = d * cosV;
|
||
|
float y = d * (-sinV);
|
||
|
float z = 0.75f * sinU;
|
||
|
|
||
|
vertices.push_back(x);
|
||
|
vertices.push_back(y);
|
||
|
vertices.push_back(z);
|
||
|
|
||
|
float nx = cosV * cosU;
|
||
|
float ny = -sinV * cosU;
|
||
|
float nz = sinU;
|
||
|
|
||
|
float length = sqrtf(nx * nx + ny * ny + nz * nz);
|
||
|
nx /= length;
|
||
|
ny /= length;
|
||
|
nz /= length;
|
||
|
|
||
|
vertices.push_back(nx);
|
||
|
vertices.push_back(ny);
|
||
|
vertices.push_back(nz);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
glGenBuffers(1, vertexBuffer);
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, *vertexBuffer);
|
||
|
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), vertices.data(),
|
||
|
GL_STATIC_DRAW);
|
||
|
|
||
|
glGenBuffers(1, indexBuffer);
|
||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
|
||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), indices.data(),
|
||
|
GL_STATIC_DRAW);
|
||
|
}
|
||
|
|
||
|
#endif // SAMPLE_TORUS_LIGHTING_H_
|