|
3D Platonic Primitive Generators
Submitted by |
This is a minimal C++ primitive polygon loader. I use it (and maintain it) for my 3d engine "DexVT", which can be found on my site.
If you like clean, minimal OOP code like I do, then this loader is for you. it manages to stay out of your code as much as possible.
PS. The Vector, Matrix, Transform utility classes are included as a bonus :)
Jerry Chen (Dextre)
http://onlyuser.cjb.net
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Vector.cpp] - (4,856 bytes)
#include "Vector.h"
Vector::Vector() {}
Vector::~Vector() {}
//=============================================================================
Vector::Vector(float x, float y, float z) {this->x = x; this->y = y; this->z = z;}
Vector::Vector(Vector &v) {*this = v;}
Vector::Vector(float s) {x = s; y = s; z = s;}
Vector::Vector(float *v) {memcpy(this->v, v, sizeof(float) * 3);}
//=============================================================================
void Vector::toArray(float *v)
{
memcpy(v, this->v, sizeof(float) * 3);
}
//=============================================================================
Vector &Vector::operator=(Vector &v) {x = v.x; y = v.y; z = v.z; return *this;}
Vector &Vector::operator+=(Vector &v) {x += v.x; y += v.y; z += v.z; return *this;}
Vector &Vector::operator-=(Vector &v) {x -= v.x; y -= v.y; z -= v.z; return *this;}
Vector &Vector::operator&=(Vector &v) {x *= v.x; y *= v.y; z *= v.z; return *this;}
Vector &Vector::operator*=(float s) {x *= s; y *= s; z *= s; return *this;}
Vector &Vector::operator/=(float s)
{
float r = 1 / s;
x *= r; y *= r; z *= r;
return *this;
}
Vector &Vector::operator*=(Vector &v)
{
return *this = Vector(
y * v.z - z * v.y,
z * v.x - x * v.z,
x * v.y - y * v.x
);
}
Vector &Vector::operator*=(Matrix &m)
{
return *this = Vector(
x * m[0][0] + y * m[1][0] + z * m[2][0] + m[3][0],
x * m[0][1] + y * m[1][1] + z * m[2][1] + m[3][1],
x * m[0][2] + y * m[1][2] + z * m[2][2] + m[3][2]
);
}
Vector Vector::operator+(Vector &v) {return Vector(*this) += v;}
Vector Vector::operator-(Vector &v) {return Vector(*this) -= v;}
Vector Vector::operator&(Vector &v) {return Vector(*this) &= v;}
Vector Vector::operator*(float s) {return Vector(*this) *= s;}
Vector Vector::operator/(float s) {return Vector(*this) /= s;}
Vector Vector::operator*(Vector &v) {return Vector(*this) *= v;}
Vector Vector::operator*(Matrix &m) {return Vector(*this) *= m;}
float &Vector::operator[](AXIS::AXIS axis) {return v[axis];}
float Vector::operator|(Vector &v) {return x * v.x + y * v.y + z * v.z;}
Vector Vector::operator-() {return *this * -1;};
bool Vector::operator==(Vector &v) {return x == v.x && y == v.y && z == v.z;}
bool Vector::operator!=(Vector &v) {return x != v.x || y != v.y || z != v.z;}
//=============================================================================
Vector &Vector::mask(Vector &m, Vector &v)
{
x = m.x ? v.x : x;
y = m.y ? v.y : y;
z = m.z ? v.z : z;
return *this;
}
Vector Vector::vec_interp(Vector &v, float s)
{
return interp(*this, v, s);
}
float Vector::mod()
{
return (float) pow(*this | *this, 0.5f);
}
float Vector::dist(Vector &v)
{
return (*this - v).mod();
}
Vector &Vector::normalize()
{
float t = this->mod();
return *this = (t != 0) ? *this / t : NULL_VECTOR;
}
Vector Vector::normal()
{
return Vector(*this).normalize();
}
Vector Vector::normTri(Vector &v1, Vector &v2)
{
return ((v1 - *this) * (v2 - *this)).normalize();
}
float Vector::angle(Vector &v)
{
return this->normal() | v.normal();
}
int Vector::compare(Vector &v1, Vector &v2)
{
return sgn((*this | v1) - (*this | v2));
}
float Vector::sectPlane(Vector &p, Vector &v, Vector &n)
{
float t = n | *this;
return (t != 0) ? (n | (v - p)) / t : BIG_NUMBER;
}
Vector Vector::project(Vector &v)
{
Vector t = v.normal();
return t * (*this | t);
}
Vector Vector::ortho(Vector &v)
{
return *this - this->project(v);
}
Vector Vector::reflect(Vector &n)
{
if (this->angle(n) < 0)
return *this + this->project(n) * -2;
return *this;
}
Vector &Vector::fromAngle(Vector &v)
{
return *this =
FWD_VECTOR * RotateTrans(AXIS::X, v.pitch) * RotateTrans(AXIS::Y, v.yaw);
}
Vector Vector::toAngle()
{
Vector t(x, 0, z);
Vector r(
0,
acosEx(t.angle(*this)),
acosEx(t.angle(FWD_VECTOR))
);
if (x < 0) r.yaw *= -1;
if (y > 0) r.pitch *= -1;
return r;
}
//=============================================================================
Vector &Vector::vec_wrap(Vector &pMin, Vector &pMax)
{
x = wrap(x, pMin.x, pMax.x);
y = wrap(y, pMin.y, pMax.y);
z = wrap(z, pMin.z, pMax.z);
return *this;
}
Vector &Vector::vec_limit(Vector &pMin, Vector &pMax)
{
x = limit(x, pMin.x, pMax.x);
y = limit(y, pMin.y, pMax.y);
z = limit(z, pMin.z, pMax.z);
return *this;
}
void Vector::multEx(float *r, Matrix &m)
{
r[0] = x * m[0][0] + y * m[1][0] + z * m[2][0] + m[3][0];
r[1] = x * m[0][1] + y * m[1][1] + z * m[2][1] + m[3][1];
r[2] = x * m[0][2] + y * m[1][2] + z * m[2][2] + m[3][2];
r[3] = x * m[0][3] + y * m[1][3] + z * m[2][3] + m[3][3];
} |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Transform.cpp] - (2,224 bytes)
#include "Transform.h"
ScaleTrans::ScaleTrans(Vector &v)
{
*((Matrix *) this) = IDENT_MATRIX;
(*this)[0][0] = v.x;
(*this)[1][1] = v.y;
(*this)[2][2] = v.z;
}
TranslateTrans::TranslateTrans(Vector &v)
{
*((Matrix *) this) = IDENT_MATRIX;
(*this)[3][0] = v.x;
(*this)[3][1] = v.y;
(*this)[3][2] = v.z;
}
RotateTrans::RotateTrans(AXIS::AXIS axis, float angle)
{
*((Matrix *) this) = IDENT_MATRIX;
float pSin = (float) sin(angle);
float pCos = (float) cos(angle);
switch (axis)
{
case AXIS::X:
(*this)[1][1] = pCos; (*this)[1][2] = pSin;
(*this)[2][1] = -pSin; (*this)[2][2] = pCos;
break;
case AXIS::Y:
(*this)[0][0] = pCos; (*this)[0][2] = -pSin;
(*this)[2][0] = pSin; (*this)[2][2] = pCos;
break;
case AXIS::Z:
(*this)[0][0] = pCos; (*this)[0][1] = pSin;
(*this)[1][0] = -pSin; (*this)[1][1] = pCos;
}
}
ComboTrans::ComboTrans(Vector &origin, Vector &angle, Vector &scale)
{
*((Matrix *) this) = IDENT_MATRIX;
(*this) *= ScaleTrans((Vector &) scale);
(*this) *= RotateTrans(AXIS::Y, angle.roll);
(*this) *= RotateTrans(AXIS::X, angle.pitch);
(*this) *= RotateTrans(AXIS::Y, angle.yaw);
(*this) *= TranslateTrans((Vector &) origin);
}
ProjectTrans::ProjectTrans(float sw, float sh, float n, float f)
{
if (n <= 0 || n > f)
throw Exception("invalid clipping planes");
*((Matrix *) this) = ZERO_MATRIX;
cx = sw / 2;
cy = sh / 2;
}
ProjectPerspectTrans::ProjectPerspectTrans(float sw, float sh, float aspect, float n, float f, float halfTan)
: ProjectTrans(sw, sh, n, f)
{
float h = halfTan * n;
float tempA = -h / n;
float tempB = -f / (n - f);
(*this)[0][0] = cx / aspect;
(*this)[1][1] = -cy;
(*this)[2][0] = cx * tempA;
(*this)[2][1] = cy * tempA;
(*this)[2][2] = tempA * tempB;
(*this)[2][3] = tempA;
(*this)[3][2] = h * tempB;
}
ProjectOrthoTrans::ProjectOrthoTrans(float sw, float sh, float aspect, float n, float f, float zoom)
: ProjectTrans(sw, sh, n, f)
{
float tempA = 1 / (n - f);
(*this)[0][0] = zoom / aspect;
(*this)[1][1] = -zoom;
(*this)[2][2] = -tempA;
(*this)[3][0] = cx;
(*this)[3][1] = cy;
(*this)[3][2] = n * tempA;
(*this)[3][3] = 1;
} |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [IMesh.h] - (555 bytes)
#ifndef H_IMESH
#define H_IMESH
#include "Vector.h"
class IMesh
{
protected:
int mVertCnt;
int mFaceCnt;
public:
IMesh(int vertCnt, int faceCnt);
~IMesh();
int getVertCnt();
int getFaceCnt();
virtual void resize(int vertCnt, int faceCnt);
virtual Vector *getVertices() = 0;
virtual void setVertex(int index, float x, float y, float z) = 0;
virtual void setFace(int index, int a, int b, int c) = 0;
virtual void setAnchor(int index, float x, float y) = 0;
virtual void getDim(Vector &pMin, Vector &pMax) = 0;
};
#endif |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Matrix.cpp] - (4,216 bytes)
#include "Matrix.h"
Matrix::Matrix() {}
Matrix::~Matrix() {}
//=============================================================================
Matrix::Matrix(Matrix &m) {*this = m;}
Matrix::Matrix(float s)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
mItem[i][j] = (i == j) ? s : 0;
}
Matrix::Matrix(float **m) {this->set(m);}
//=============================================================================
inline void Matrix::get(float **m)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
m[i][j] = mItem[i][j];
}
inline Matrix &Matrix::set(float **m)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
mItem[i][j] = m[i][j];
return *this;
}
//=============================================================================
void Matrix::toArray(float *m)
{
for (int i = 0; i < 4; i++)
memcpy(&m[i * 4], mItem[i], sizeof(float) * 4);
}
//=============================================================================
inline Matrix &Matrix::mult(Matrix &m)
{
Matrix t;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
t[i][j] =
mItem[i][0] * m[0][j] +
mItem[i][1] * m[1][j] +
mItem[i][2] * m[2][j] +
mItem[i][3] * m[3][j];
return *this = t;
}
inline Matrix &Matrix::scale(float s)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
mItem[i][j] *= s;
return *this;
}
//=============================================================================
inline Matrix Matrix::mult(Matrix &m1, Matrix &m2)
{
Matrix r;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
r[i][j] =
m1[i][0] * m2[0][j] +
m1[i][1] * m2[1][j] +
m1[i][2] * m2[2][j] +
m1[i][3] * m2[3][j];
return r;
}
inline Matrix Matrix::scale(Matrix &m, float s)
{
Matrix r;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
r[i][j] = m[i][j] * s;
return r;
}
//=============================================================================
Matrix &Matrix::operator=(Matrix &m)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
mItem[i][j] = m[i][j];
return *this;
}
Matrix Matrix::operator~()
{
Matrix r;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
r[i][j] = mItem[j][i];
return r;
}
Matrix &Matrix::operator*=(Matrix &m) {return this->mult(m);}
Matrix &Matrix::operator*=(float s) {return this->scale(s);}
Matrix &Matrix::operator/=(float s) {return this->scale(1 / s);}
Matrix Matrix::operator*(Matrix &m) {return this->mult(*this, m);}
Matrix Matrix::operator*(float s) {return this->scale(*this, s);}
Matrix Matrix::operator/(float s) {return this->scale(*this, 1 / s);}
float *Matrix::operator[](int row) {return mItem[row];}
Matrix Matrix::operator!() {return this->inverse();}
//=============================================================================
inline void Matrix::minor(float **r, float **m, int rowCnt, int colCnt, int row, int col)
{
int row2 = 0;
for (int i = 0; i < rowCnt; i++)
if (i != row)
{
int col2 = 0;
for (int j = 0; j < colCnt; j++)
if (j != col)
{
r[row2][col2] = m[i][j];
col2++;
}
row2++;
}
}
inline float Matrix::cofact(float **t, float **m, int size, int row, int col)
{
minor(t, m, size, size, row, col);
return (float) pow(-1, row + col) * det(t, size - 1);
}
inline float Matrix::det(float **m, int size)
{
float result = 0;
if (size == 1)
result = m[0][0];
else
{
float **t = buildArray(size - 1, size - 1);
for (int i = 0; i < size; i++)
result += m[0][i] * cofact(t, m, size, 0, i);
killArray(t, size - 1);
}
return result;
}
Matrix &Matrix::invert()
{
float **m = buildArray(4, 4);
float **t = buildArray(3, 3);
float **r = buildArray(4, 4);
this->get(m);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
r[i][j] = cofact(t, m, 4, i, j);
float d = det(r, 4);
this->set(r);
killArray(m, 4);
killArray(t, 3);
killArray(r, 4);
return *this = (d != 0) ? ~(*this) / d : ZERO_MATRIX;
}
Matrix Matrix::inverse()
{
return Matrix(*this).invert();
} |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [IMesh.cpp] - (327 bytes)
#include "IMesh.h"
IMesh::IMesh(int vertCnt, int faceCnt)
{
this->resize(vertCnt, faceCnt);
}
IMesh::~IMesh()
{
}
void IMesh::resize(int vertCnt, int faceCnt)
{
mVertCnt = vertCnt;
mFaceCnt = faceCnt;
}
int IMesh::getVertCnt()
{
return mVertCnt;
}
int IMesh::getFaceCnt()
{
return mFaceCnt;
} |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Vector.h] - (2,905 bytes)
#ifndef H_VECTOR
#define H_VECTOR
#include <windows.h> // memcpy()
#include <math.h> // pow()
#include "Matrix.h"
#include "Util.h" // BIG_NUMBER
#define UNIT_VECTOR UnitVector
#define NULL_VECTOR NullVector
#define FWD_VECTOR FwdVector
#define LEFT_VECTOR LeftVector
#define UP_VECTOR UpVector
#define RAND_VECTOR Vector(rand(), rand(), rand())
namespace AXIS
{
enum AXIS {X, Y, Z, S};
};
class Vector
{
public:
union
{
float v[3];
struct
{
union {float x; float roll;};
union {float y; float pitch;};
union {float z; float yaw;};
};
};
Vector();
~Vector();
//=============================================================================
Vector(float x, float y, float z);
Vector(Vector &v);
Vector(float s);
Vector(float *v);
//=============================================================================
void toArray(float *v);
//=============================================================================
Vector &operator=(Vector &v);
//=============================================================================
Vector &operator+=(Vector &v);
Vector &operator-=(Vector &v);
Vector &operator&=(Vector &v);
Vector &operator*=(float s);
Vector &operator/=(float s);
Vector &operator*=(Vector &v);
Vector &operator*=(Matrix &m);
//=============================================================================
Vector operator+(Vector &v);
Vector operator-(Vector &v);
Vector operator&(Vector &v);
Vector operator*(float s);
Vector operator/(float s);
Vector operator*(Vector &v);
Vector operator*(Matrix &m);
//=============================================================================
float &operator[](AXIS::AXIS axis);
float operator|(Vector &v);
Vector operator-();
bool operator==(Vector &v);
bool operator!=(Vector &v);
//=============================================================================
Vector &mask(Vector &m, Vector &v);
Vector vec_interp(Vector &v, float s);
float mod();
float dist(Vector &v);
Vector &normalize();
Vector normal();
Vector normTri(Vector &v1, Vector &v2);
float angle(Vector &v);
int compare(Vector &v1, Vector &v2);
float sectPlane(Vector &p, Vector &v, Vector &n);
Vector project(Vector &v);
Vector ortho(Vector &v);
Vector reflect(Vector &n);
Vector &fromAngle(Vector &v);
Vector toAngle();
//=============================================================================
Vector &vec_wrap(Vector &pMin, Vector &pMax);
Vector &vec_limit(Vector &pMin, Vector &pMax);
void multEx(float *r, Matrix &m);
//=============================================================================
};
static Vector UnitVector(1.0);
static Vector NullVector(0.0);
static Vector FwdVector(0, 0, 1);
static Vector LeftVector(1, 0, 0);
static Vector UpVector(0, 1, 0);
#include "Transform.h"
#endif |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Transform.h] - (1,004 bytes)
#ifndef H_TRANSFORM
#define H_TRANSFORM
#include <math.h> // sin(), cos()
#include "Vector.h"
#include "Matrix.h"
#include "Exception.h"
class ScaleTrans : public Matrix {public: ScaleTrans(Vector &v);};
class TranslateTrans : public Matrix {public: TranslateTrans(Vector &v);};
class RotateTrans : public Matrix {public: RotateTrans(AXIS::AXIS axis, float angle);};
class ComboTrans : public Matrix
{
public:
ComboTrans(
Vector &origin,
Vector &angle,
Vector &scale
);
};
class ProjectTrans : public Matrix
{
protected:
float cx;
float cy;
public:
ProjectTrans(
float sw, float sh, float n, float f
);
};
class ProjectPerspectTrans : public ProjectTrans
{
public:
ProjectPerspectTrans(
float sw, float sh, float aspect, float n, float f,
float halfTan
);
};
class ProjectOrthoTrans : public ProjectTrans
{
public:
ProjectOrthoTrans(
float sw, float sh, float aspect, float n, float f,
float zoom
);
};
#endif |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Polygon.h] - (598 bytes)
#ifndef H_POLYGON
#define H_POLYGON
#include "IMesh.h"
class Polygon
{
public:
static void makeBox(IMesh *mesh);
static void makeGrid(IMesh *mesh, int gridX, int gridZ);
static void makeCylinder(IMesh *mesh, int step);
static void makeCone(IMesh *mesh, int step);
static void makeSphere(IMesh *mesh, int stepLng, int stepLat);
static void makeHemis(IMesh *mesh, int stepLng, int stepLat);
static void makeTorus(IMesh *mesh, float radMajor, float radMinor, int stepMajor, int stepMinor);
static void makeOcta(IMesh *mesh);
static void makeTetra(IMesh *mesh);
};
#endif |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Matrix.h] - (2,546 bytes)
#ifndef H_MATRIX
#define H_MATRIX
#include <windows.h> // memcpy()
#include <math.h> // pow()
#define IDENT_MATRIX IdentMatrix
#define ZERO_MATRIX ZeroMatrix
inline float **buildArray(int rowCnt, int colCnt)
{
float **r = new float *[rowCnt];
for (int i = 0; i < rowCnt; i++)
r[i] = new float[colCnt];
return r;
}
inline void killArray(float **m, int rowCnt)
{
for (int i = 0; i < rowCnt; i++)
delete []m[i];
delete []m;
}
class Matrix
{
private:
float mItem[4][4];
//=============================================================================
inline void get(float **m);
inline Matrix &set(float **m);
//=============================================================================
inline Matrix &mult(Matrix &m);
inline Matrix &scale(float s);
//=============================================================================
inline Matrix mult(Matrix &m1, Matrix &m2);
inline Matrix scale(Matrix &m, float s);
//=============================================================================
static inline void minor(float **r, float **m, int rowCnt, int colCnt, int row, int col);
static inline float cofact(float **t, float **m, int size, int row, int col);
static inline float det(float **m, int size);
//=============================================================================
public:
Matrix();
~Matrix();
//=============================================================================
Matrix(Matrix &m);
Matrix(float **m);
Matrix(float s);
//=============================================================================
void toArray(float *m);
//=============================================================================
Matrix &operator=(Matrix &m);
Matrix operator~();
//=============================================================================
Matrix &operator*=(Matrix &m);
Matrix &operator*=(float s);
Matrix &operator/=(float s);
//=============================================================================
Matrix operator*(Matrix &m);
Matrix operator*(float s);
Matrix operator/(float s);
//=============================================================================
float *operator[](int row);
Matrix operator!();
//=============================================================================
Matrix &invert();
Matrix inverse();
//=============================================================================
};
static Matrix IdentMatrix(1.0);
static Matrix ZeroMatrix(0.0);
#endif |
|
Currently browsing [3DPlatonicPrimitives.zip] (7,232 bytes) - [Polygon.cpp] - (4,489 bytes)
#include "Polygon.h"
void Polygon::makeBox(IMesh *mesh)
{
mesh->resize(8, 12);
mesh->setVertex(0, 0, 0, 0);
mesh->setVertex(1, 1, 0, 0);
mesh->setVertex(2, 1, 0, 1);
mesh->setVertex(3, 0, 0, 1);
mesh->setVertex(4, 0, 1, 0);
mesh->setVertex(5, 1, 1, 0);
mesh->setVertex(6, 1, 1, 1);
mesh->setVertex(7, 0, 1, 1);
mesh->setFace(0, 0, 4, 5);
mesh->setFace(1, 5, 1, 0);
mesh->setFace(2, 1, 5, 6);
mesh->setFace(3, 6, 2, 1);
mesh->setFace(4, 2, 6, 7);
mesh->setFace(5, 7, 3, 2);
mesh->setFace(6, 3, 7, 4);
mesh->setFace(7, 4, 0, 3);
mesh->setFace(8, 0, 1, 2);
mesh->setFace(9, 2, 3, 0);
mesh->setFace(10, 5, 4, 7);
mesh->setFace(11, 7, 6, 5);
}
void Polygon::makeGrid(IMesh *mesh, int gridX, int gridZ)
{
mesh->resize(gridX * gridZ, (gridX - 1) * (gridZ - 1) * 2);
int vertCnt = 0;
int faceCnt = 0;
for (int x = 0; x < gridX; x++)
for (int z = 0; z < gridZ; z++)
{
mesh->setVertex(
vertCnt, 1 - (float) x / (gridX - 1), 0, 1 - (float) z / (gridZ - 1)
);
if (x < gridX - 1 && z < gridZ - 1)
{
mesh->setFace(
faceCnt++, vertCnt + 0, vertCnt + 1, vertCnt + 1 + gridZ
);
mesh->setFace(
faceCnt++, vertCnt + 1 + gridZ, vertCnt + gridZ, vertCnt + 0
);
}
vertCnt++;
}
}
void Polygon::makeCylinder(IMesh *mesh, int step)
{
makeGrid(mesh, step + 1, 4);
float unit = 2 * PI / step;
int vertCnt = 0;
for (int i = 0; i < step + 1; i++)
{
mesh->setVertex(vertCnt++, 0, 1, 0);
Vector v =
Vector(0, 0, 1) *
RotateTrans(AXIS::Y, i * unit);
mesh->setVertex(vertCnt++, v.x, v.y + 1, v.z);
mesh->setVertex(vertCnt++, v.x, v.y, v.z);
mesh->setVertex(vertCnt++, 0, 0, 0);
}
}
void Polygon::makeCone(IMesh *mesh, int step)
{
makeGrid(mesh, step + 1, 3);
float unit = 2 * PI / step;
int vertCnt = 0;
for (int i = 0; i < step + 1; i++)
{
mesh->setVertex(vertCnt++, 0, 1, 0);
Vector v =
Vector(0, 0, 1) *
RotateTrans(AXIS::Y, i * unit);
mesh->setVertex(vertCnt++, v.x, v.y, v.z);
mesh->setVertex(vertCnt++, 0, 0, 0);
}
}
void Polygon::makeSphere(IMesh *mesh, int stepLng, int stepLat)
{
makeGrid(mesh, stepLng + 1, (stepLat / 2) + 1);
float unitLng = 2 * PI / stepLng;
float unitLat = PI / (stepLat / 2);
int vertCnt = 0;
for (int i = 0; i < stepLng + 1; i++)
for (int j = 0; j < (stepLat / 2) + 1; j++)
{
Vector v =
Vector(0, 1, 0) *
RotateTrans(AXIS::X, j * unitLat) *
RotateTrans(AXIS::Y, i * unitLng);
mesh->setVertex(vertCnt++, v.x, v.y, v.z);
}
}
void Polygon::makeHemis(IMesh *mesh, int stepLng, int stepLat)
{
makeGrid(mesh, stepLng + 1, (stepLat / 4) + 2);
float unitLng = 2 * PI / stepLng;
float unitLat = PI / (stepLat / 2);
int vertCnt = 0;
for (int i = 0; i < stepLng + 1; i++)
{
for (int j = 0; j < (stepLat / 4) + 1; j++)
{
Vector v =
Vector(0, 1, 0) *
RotateTrans(AXIS::X, j * unitLat) *
RotateTrans(AXIS::Y, i * unitLng);
mesh->setVertex(vertCnt++, v.x, v.y, v.z);
}
mesh->setVertex(vertCnt++, 0, 0, 0);
}
}
void Polygon::makeTorus(
IMesh *mesh, float radMajor, float radMinor, int stepMajor, int stepMinor
)
{
makeGrid(mesh, stepMajor + 1, stepMinor + 1);
float unitMajor = 2 * PI / stepMajor;
float unitMinor = 2 * PI / stepMinor;
int vertCnt = 0;
for (int i = 0; i < stepMajor + 1; i++)
for (int j = 0; j < stepMinor + 1; j++)
{
Vector v =
Vector(0, radMinor, 0) *
RotateTrans(AXIS::X, j * unitMinor) *
TranslateTrans(Vector(0, 0, radMajor)) *
RotateTrans(AXIS::Y, i * unitMajor);
mesh->setVertex(vertCnt++, v.x, v.y, v.z);
}
}
void Polygon::makeOcta(IMesh *mesh)
{
mesh->resize(6, 8);
mesh->setVertex(0, 0, 0, 0);
mesh->setVertex(1, 1, 0, 0);
mesh->setVertex(2, 1, 0, 1);
mesh->setVertex(3, 0, 0, 1);
mesh->setVertex(4, 0.5f, -1, 0.5f);
mesh->setVertex(5, 0.5f, 1, 0.5f);
mesh->setFace(0, 0, 1, 4);
mesh->setFace(1, 1, 2, 4);
mesh->setFace(2, 2, 3, 4);
mesh->setFace(3, 3, 0, 4);
mesh->setFace(4, 0, 5, 1);
mesh->setFace(5, 1, 5, 2);
mesh->setFace(6, 2, 5, 3);
mesh->setFace(7, 3, 5, 0);
}
void Polygon::makeTetra(IMesh *mesh)
{
mesh->resize(4, 4);
mesh->setVertex(0, 0, 0, 0);
mesh->setVertex(1, 1, 1, 0);
mesh->setVertex(2, 0, 1, 1);
mesh->setVertex(3, 1, 0, 1);
mesh->setFace(0, 0, 1, 3);
mesh->setFace(1, 0, 2, 1);
mesh->setFace(2, 0, 3, 2);
mesh->setFace(3, 1, 2, 3);
} |
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|