100 lines
4.3 KiB
C++
100 lines
4.3 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Sphere.h
|
|
// ========
|
|
// Sphere for OpenGL with (radius, sectors, stacks)
|
|
// The min number of sectors is 3 and The min number of stacks are 2.
|
|
//
|
|
// AUTHOR: Song Ho Ahn (song.ahn@gmail.com)
|
|
// CREATED: 2017-11-01
|
|
// UPDATED: 2020-05-20
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef GEOMETRY_SPHERE_H
|
|
#define GEOMETRY_SPHERE_H
|
|
|
|
#include <vector>
|
|
|
|
class Sphere
|
|
{
|
|
public:
|
|
// ctor/dtor
|
|
Sphere(float radius=1.0f, int sectorCount=36, int stackCount=18, bool smooth=true);
|
|
~Sphere() {}
|
|
|
|
// getters/setters
|
|
float getRadius() const { return radius; }
|
|
int getSectorCount() const { return sectorCount; }
|
|
int getStackCount() const { return stackCount; }
|
|
void set(float radius, int sectorCount, int stackCount, bool smooth=true);
|
|
void setRadius(float radius);
|
|
void setSectorCount(int sectorCount);
|
|
void setStackCount(int stackCount);
|
|
void setSmooth(bool smooth);
|
|
|
|
// for vertex data
|
|
unsigned int getVertexCount() const { return (unsigned int)vertices.size() / 3; }
|
|
unsigned int getNormalCount() const { return (unsigned int)normals.size() / 3; }
|
|
unsigned int getTexCoordCount() const { return (unsigned int)texCoords.size() / 2; }
|
|
unsigned int getIndexCount() const { return (unsigned int)indices.size(); }
|
|
unsigned int getLineIndexCount() const { return (unsigned int)lineIndices.size(); }
|
|
unsigned int getTriangleCount() const { return getIndexCount() / 3; }
|
|
unsigned int getVertexSize() const { return (unsigned int)vertices.size() * sizeof(float); }
|
|
unsigned int getNormalSize() const { return (unsigned int)normals.size() * sizeof(float); }
|
|
unsigned int getTexCoordSize() const { return (unsigned int)texCoords.size() * sizeof(float); }
|
|
unsigned int getIndexSize() const { return (unsigned int)indices.size() * sizeof(unsigned int); }
|
|
unsigned int getLineIndexSize() const { return (unsigned int)lineIndices.size() * sizeof(unsigned int); }
|
|
const float* getVertices() const { return vertices.data(); }
|
|
const float* getNormals() const { return normals.data(); }
|
|
const float* getTexCoords() const { return texCoords.data(); }
|
|
const unsigned int* getIndices() const { return indices.data(); }
|
|
const unsigned int* getLineIndices() const { return lineIndices.data(); }
|
|
|
|
// for interleaved vertices: V/N/T
|
|
unsigned int getInterleavedVertexCount() const { return getVertexCount(); } // # of vertices
|
|
unsigned int getInterleavedVertexSize() const { return (unsigned int)interleavedVertices.size() * sizeof(float); } // # of bytes
|
|
int getInterleavedStride() const { return interleavedStride; } // should be 32 bytes
|
|
const float* getInterleavedVertices() const { return interleavedVertices.data(); }
|
|
|
|
// draw in VertexArray mode
|
|
void draw() const; // draw surface
|
|
void drawLines(const float lineColor[4]) const; // draw lines only
|
|
void drawWithLines(const float lineColor[4]) const; // draw surface and lines
|
|
|
|
// debug
|
|
void printSelf() const;
|
|
|
|
protected:
|
|
|
|
private:
|
|
// member functions
|
|
void buildVerticesSmooth();
|
|
void buildVerticesFlat();
|
|
void buildInterleavedVertices();
|
|
void clearArrays();
|
|
void addVertex(float x, float y, float z);
|
|
void addNormal(float x, float y, float z);
|
|
void addTexCoord(float s, float t);
|
|
void addIndices(unsigned int i1, unsigned int i2, unsigned int i3);
|
|
std::vector<float> computeFaceNormal(float x1, float y1, float z1,
|
|
float x2, float y2, float z2,
|
|
float x3, float y3, float z3);
|
|
|
|
// memeber vars
|
|
float radius;
|
|
int sectorCount; // longitude, # of slices
|
|
int stackCount; // latitude, # of stacks
|
|
bool smooth;
|
|
std::vector<float> vertices;
|
|
std::vector<float> normals;
|
|
std::vector<float> texCoords;
|
|
std::vector<unsigned int> indices;
|
|
std::vector<unsigned int> lineIndices;
|
|
|
|
// interleaved
|
|
std::vector<float> interleavedVertices;
|
|
int interleavedStride; // # of bytes to hop to the next vertex (should be 32 bytes)
|
|
|
|
};
|
|
|
|
#endif
|