Ignore:
Timestamp:
Jul 10, 2012, 1:18:31 PM (7 years ago)
Author:
sam
Message:

easymesh: add the capsule mesh.

Location:
trunk/src/easymesh
Files:
4 edited

Legend:

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

    r1510 r1619  
    5151%token T_CHAMFER
    5252
    53 %token T_CYLINDER T_BOX T_SMOOTHCHAMFBOX T_FLATCHAMFBOX T_SPHERE T_STAR
    54 %token T_EXPANDEDSTAR T_DISC T_TRIANGLE T_QUAD T_COG
     53%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
    5555
    5656%token T_END 0
     
    148148  | T_SPHERE args4         { mc.m_mesh.AppendSphere($2.f0,
    149149                                               vec3($2.f1, $2.f2, $2.f3)); }
     150  | T_CAPSULE args3        { mc.m_mesh.AppendCapsule($2.f0, $2.f1, $2.f2); }
    150151  | T_STAR args5           { mc.m_mesh.AppendStar((int)$2.f0, $2.f1, $2.f2,
    151152                                             (int)$2.f3, (int)$2.f4); }
  • trunk/src/easymesh/easymesh-scanner.l

    r1512 r1619  
    7575ascb  { return token::T_SMOOTHCHAMFBOX; }
    7676afcb  { return token::T_FLATCHAMFBOX; }
     77acap  { return token::T_CAPSULE; }
    7778asph  { return token::T_SPHERE; }
    7879as    { return token::T_STAR; }
  • trunk/src/easymesh/easymesh.cpp

    r1604 r1619  
    1818#if defined HAVE_CONFIG_H
    1919#   include "config.h"
     20#endif
     21
     22#if defined _XBOX
     23#   define _USE_MATH_DEFINES /* for M_PI */
     24#   include <xtl.h>
     25#   undef near /* Fuck Microsoft */
     26#   undef far /* Fuck Microsoft again */
     27#elif defined _WIN32
     28#   define _USE_MATH_DEFINES /* for M_PI */
     29#   define WIN32_LEAN_AND_MEAN
     30#   include <windows.h>
     31#   undef near /* Fuck Microsoft */
     32#   undef far /* Fuck Microsoft again */
    2033#endif
    2134
     
    348361}
    349362
    350 void EasyMesh::AppendSphere(int ndivisions, vec3 const &size)
     363void EasyMesh::AppendCapsule(int ndivisions, float h, float r)
    351364{
    352365    int ibase = m_indices.Count();
     
    354367    Array<vec3> vertices;
    355368
     369    /* Fill in the icosahedron vertices, rotating them so that there
     370     * is a vertex at [0 0 1] and [0 0 -1] after normalisation. */
    356371    float phi = 0.5f + 0.5f * sqrt(5.f);
     372    mat3 mat = mat3::rotate(asin(1.f / sqrt(2.f + phi)) * (180.f / M_PI),
     373                            vec3(1.f, 0.f, 0.f));
    357374    for (int i = 0; i < 4; i++)
    358375    {
    359376        float x = (i & 1) ? 0.5f : -0.5f;
    360377        float y = (i & 2) ? phi * 0.5f : phi * -0.5f;
    361         vertices << vec3(x, y, 0.f);
    362         vertices << vec3(0.f, x, y);
    363         vertices << vec3(y, 0.f, x);
     378        vertices << mat * vec3(x, y, 0.f);
     379        vertices << mat * vec3(0.f, x, y);
     380        vertices << mat * vec3(y, 0.f, x);
    364381    }
    365382
     
    376393    for (unsigned i = 0; i < sizeof(trilist) / sizeof(*trilist); i += 3)
    377394    {
    378         vec3 const &p0 = vertices[trilist[i]];
    379         vec3 const &p1 = vertices[trilist[i + 1]];
    380         vec3 const &p2 = vertices[trilist[i + 2]];
    381 
    382         vec3 const vx = 1.f / ndivisions * (p1 - p0);
    383         vec3 const vy = 1.f / ndivisions * (p2 - p0);
     395        vec3 const &a = vertices[trilist[i]];
     396        vec3 const &b = vertices[trilist[i + 1]];
     397        vec3 const &c = vertices[trilist[i + 2]];
     398
     399        vec3 const vb = 1.f / ndivisions * (b - a);
     400        vec3 const vc = 1.f / ndivisions * (c - a);
    384401
    385402        int line = ndivisions + 1;
     
    387404        for (int v = 0, x = 0, y = 0; x < ndivisions + 1; v++)
    388405        {
    389             vec3 p = p0 + x * vx + y * vy;
     406            vec3 p[] = { a + x * vb + y * vc,
     407                         p[0] + vb,
     408                         p[0] + vc,
     409                         p[0] + vb + vc };
     410
     411            /* FIXME: when we normalise here, we get a volume that is slightly
     412             * smaller than the sphere of radius 1, since we are not using
     413             * the midradius. */
     414            for (int k = 0; k < 4; k++)
     415                p[k] = normalize(p[k]) * r;
     416
     417            /* If this is a capsule, grow in the Z direction */
     418            if (h > 0.f)
     419            {
     420                for (int k = 0; k < 4; k++)
     421                    p[k].z += (p[k].z > 0.f) ? 0.5f * h : -0.5f * h;
     422            }
    390423
    391424            /* Add zero, one or two triangles */
    392425            if (y < line - 1)
    393426            {
    394                 AddVertex(normalize(p) * size);
    395                 AddVertex(normalize(p + vx) * size);
    396                 AddVertex(normalize(p + vy) * size);
     427                AddVertex(p[0]);
     428                AddVertex(p[1]);
     429                AddVertex(p[2]);
    397430                AppendTriangle(0, 2, 1, m_vert.Count() - 3);
    398431            }
     
    400433            if (y < line - 2)
    401434            {
    402                 AddVertex(normalize(p + vx) * size);
    403                 AddVertex(normalize(p + vx + vy) * size);
    404                 AddVertex(normalize(p + vy) * size);
     435                AddVertex(p[1]);
     436                AddVertex(p[3]);
     437                AddVertex(p[2]);
    405438                AppendTriangle(0, 2, 1, m_vert.Count() - 3);
    406439            }
     
    417450
    418451    ComputeNormals(ibase, m_indices.Count() - ibase);
     452}
     453
     454void EasyMesh::AppendSphere(int ndivisions, vec3 const &size)
     455{
     456    AppendCapsule(ndivisions, 0.f, size.x);
    419457}
    420458
  • trunk/src/easymesh/easymesh.h

    r1510 r1619  
    6767    void AppendCylinder(int nsides, float h, float r1, float r2,
    6868                        int dualside, int smooth);
     69    void AppendCapsule(int ndivisions, float h, float r);
    6970    void AppendSphere(int ndivisions, vec3 const &size);
    7071    void AppendBox(vec3 const &size, float chamf = 0.f);
Note: See TracChangeset for help on using the changeset viewer.