Ignore:
Timestamp:
Sep 4, 2012, 2:08:19 PM (7 years ago)
Author:
sam
Message:

easymesh: first shot at a simple, flat shaded torus.

Location:
trunk/src/easymesh
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/easymesh/easymesh-parser.y

    r1835 r1875  
    5252
    5353%token T_CYLINDER T_BOX T_SMOOTHCHAMFBOX T_FLATCHAMFBOX T_SPHERE T_CAPSULE
    54 %token T_STAR T_EXPANDEDSTAR T_DISC T_TRIANGLE T_QUAD T_COG
     54%token T_STAR T_EXPANDEDSTAR T_DISC T_TRIANGLE T_QUAD T_COG T_TORUS
    5555
    5656%token T_END 0
     
    149149                                               vec3($2.f1, $2.f2, $2.f3)); }
    150150  | T_CAPSULE args3        { mc.m_mesh.AppendCapsule($2.f0, $2.f1, $2.f2); }
     151  | T_TORUS args3          { mc.m_mesh.AppendTorus((int)$2.f0, $2.f1, $2.f2); }
    151152  | T_STAR args5           { mc.m_mesh.AppendStar((int)$2.f0, $2.f1, $2.f2,
    152153                                             (int)$2.f3, (int)$2.f4); }
  • trunk/src/easymesh/easymesh-scanner.l

    r1808 r1875  
    7777acap  { return token::T_CAPSULE; }
    7878asph  { return token::T_SPHERE; }
     79at    { return token::T_TORUS; }
    7980as    { return token::T_STAR; }
    8081aes   { return token::T_EXPANDEDSTAR; }
  • trunk/src/easymesh/easymesh.cpp

    r1793 r1875  
    509509}
    510510
     511void EasyMesh::AppendTorus(int ndivisions, float r1, float r2)
     512{
     513    int ibase = m_indices.Count();
     514
     515    for (int j = 0; j < ndivisions; j++)
     516    for (int i = 0; i < ndivisions; i++)
     517    {
     518        for (int di = 0; di < 2; di++)
     519        for (int dj = 0; dj < 2; dj++)
     520        {
     521            int i2 = (i + di) % ndivisions;
     522            int j2 = (j + dj) % ndivisions;
     523            float x = 0.5f * (r1 + r2) + 0.5 * (r2 - r1) * lol::cos(2.0 * M_PI * i2 / ndivisions);
     524            float y = 0.5f * (r2 - r1) * lol::sin(2.0 * M_PI * i2 / ndivisions);
     525            float z = 0.0f;
     526
     527            float ca = lol::cos(2.0 * M_PI * j2 / ndivisions);
     528            float sa = lol::sin(2.0 * M_PI * j2 / ndivisions);
     529            float x2 = x * ca - z * sa;
     530            float z2 = z * ca + x * sa;
     531
     532            AddVertex(vec3(x2, y, z2));
     533        }
     534
     535        AppendTriangle(0, 2, 3, m_vert.Count() - 4);
     536        AppendTriangle(0, 3, 1, m_vert.Count() - 4);
     537    }
     538
     539    ComputeNormals(ibase, m_indices.Count() - ibase);
     540}
     541
    511542void EasyMesh::AppendBox(vec3 const &size, float chamf)
    512543{
  • trunk/src/easymesh/easymesh.h

    r1784 r1875  
    7474    void AppendCapsule(int ndivisions, float h, float r);
    7575    void AppendSphere(int ndivisions, vec3 const &size);
     76    void AppendTorus(int ndivisions, float r1, float r2);
    7677    void AppendBox(vec3 const &size, float chamf = 0.f);
    7778    void AppendSmoothChamfBox(vec3 const &size, float chamf);
Note: See TracChangeset for help on using the changeset viewer.