Changeset 2350


Ignore:
Timestamp:
Feb 5, 2013, 12:18:18 AM (7 years ago)
Author:
touky
Message:

easymesh : CSG operation is now handled with a safe enum.

Location:
trunk/src/easymesh
Files:
4 edited

Legend:

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

    r2318 r2350  
    4949%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_SCALEZ T_MIRRORZ
    5050%token T_TRANSLATE T_SCALE T_TOGGLESCALEWINDING T_RADIALJITTER
    51 %token T_CSGUNION T_CSGSUBSTRACT T_CSGAND T_CSGXOR
     51%token T_CSGUNION T_CSGSUBSTRACT T_CSGSUBSTRACTLOSS T_CSGAND T_CSGXOR
    5252%token T_CHAMFER
    5353
     
    140140  | T_CSGUNION             { mc.m_mesh.CsgUnion(); }
    141141  | T_CSGSUBSTRACT         { mc.m_mesh.CsgSubstract(); }
     142  | T_CSGSUBSTRACTLOSS     { mc.m_mesh.CsgSubstractLoss(); }
    142143  | T_CSGAND               { mc.m_mesh.CsgAnd(); }
    143144  | T_CSGXOR               { mc.m_mesh.CsgXor(); }
  • trunk/src/easymesh/easymesh-scanner.l

    r2294 r2350  
    7575csgu  { return token::T_CSGUNION; }
    7676csgs  { return token::T_CSGSUBSTRACT; }
     77csgsl { return token::T_CSGSUBSTRACTLOSS; }
    7778csga  { return token::T_CSGAND; }
    7879csgx  { return token::T_CSGXOR; }
  • trunk/src/easymesh/easymesh.cpp

    r2318 r2350  
    208208}
    209209
    210 void EasyMesh::MeshCsg(int csg_operation)
     210void EasyMesh::MeshCsg(CSGUsage csg_operation)
    211211{
    212212    //A vertex dictionnary for vertices on the same spot.
     
    310310                    //Triangle Kill Test
    311311                    if (//csgu : CSGUnion() -> m0_Outside + m1_Outside
    312                         (csg_operation == CSG_UNION && tri_list[k].m1 == LEAF_BACK) ||
     312                        (csg_operation == CSGUsage::Union && tri_list[k].m1 == LEAF_BACK) ||
    313313                        //csgs : CSGSubstract() -> m0_Outside + m1_Inside-inverted
    314                         (csg_operation == CSG_SUBSTRACT &&
     314                        (csg_operation == CSGUsage::Substract &&
    315315                            ((mesh_id == 0 && tri_list[k].m1 == LEAF_BACK) ||
    316316                            (mesh_id == 1 && tri_list[k].m1 == LEAF_FRONT))) ||
     317                        //csgs : CSGSubstractLoss() -> m0_Outside
     318                        (csg_operation == CSGUsage::SubstractLoss &&
     319                            ((mesh_id == 0 && tri_list[k].m1 == LEAF_BACK) || mesh_id == 1)) ||
    317320                        //csga : CSGAnd() -> Inside + Inside
    318                         (csg_operation == CSG_AND && tri_list[k].m1 == LEAF_FRONT))
     321                        (csg_operation == CSGUsage::And && tri_list[k].m1 == LEAF_FRONT))
    319322                    {
    320323                        triangle_to_kill.Push(tri_idx);
     
    323326                    //Triangle Invert Test
    324327                    if (//csgs : CSGSubstract() -> m0_Outside + m1_Inside-inverted
    325                         (csg_operation == CSG_SUBSTRACT && mesh_id == 1 && tri_list[k].m1 == LEAF_BACK) ||
     328                        (csg_operation == CSGUsage::Substract && mesh_id == 1 && tri_list[k].m1 == LEAF_BACK) ||
    326329                        //csgx : CSGXor() -> Outside/Inside-inverted + Outside/Inside-inverted
    327                         (csg_operation == CSG_XOR && tri_list[k].m1 == LEAF_BACK))
     330                        (csg_operation == CSGUsage::Xor && tri_list[k].m1 == LEAF_BACK))
    328331                    {
    329332                        //a Xor means we will share vertices with the outside, so duplicate the vertices.
    330333                        //TODO : This operation disconnect all triangle, in some cases, not a good thing.
    331                         if (csg_operation == CSG_XOR)
     334                        if (csg_operation == CSGUsage::Xor)
    332335                        {
    333336                            for (int l = 0; l < 3; l++)
     
    571574void EasyMesh::AddVertex(vec3 const &coord)
    572575{
     576    //TODO : m_vert.Push(coord, vec3(0.f, 1.f, 0.f), m_color, ivec2(0), vec2(0));
    573577    m_vert.Push(coord, vec3(0.f, 1.f, 0.f), m_color);
    574578}
     
    576580void EasyMesh::AddDuplicateVertex(int i)
    577581{
    578     m_vert.Push(m_vert[i].m1, vec3(0.f, 1.f, 0.f), m_vert[i].m3);
     582    m_vert << m_vert[i];
    579583}
    580584
     
    770774
    771775    for (int i = 0; i < vlen; i++)
    772         m_vert << m_vert[m_cursors.Last().m1++];
     776        AddDuplicateVertex(m_cursors.Last().m1++);
    773777
    774778    for (int i = 0; i < tlen; i++)
  • trunk/src/easymesh/easymesh.h

    r2294 r2350  
    2222{
    2323
     24/* A safe enum for MeshCSG operations. */
     25struct CSGUsage
     26{
     27    enum Value
     28    {
     29        Union,
     30        Substract,
     31        SubstractLoss, //will remove B from A, but not add inverted B
     32        And,
     33        Xor,
     34    }
     35    m_value;
     36
     37    inline CSGUsage(Value v) : m_value(v) {}
     38    inline operator Value() { return m_value; }
     39};
     40
     41
    2442class EasyMesh
    2543{
     
    3553private:
    3654    void UpdateVertexDict(Array< int, int > &vertex_dict);
    37 //DEBUG
     55
     56    //-------------------------------------------------------------------------
     57    //Mesh CSG operations
     58    //-------------------------------------------------------------------------
     59private:
     60    void MeshCsg(CSGUsage csg_operation);
    3861public:
    39 #define CSG_UNION       0
    40 #define CSG_SUBSTRACT   1
    41 #define CSG_AND         2
    42 #define CSG_XOR         3
    43 
    44     void MeshCsg(int csg_operation);
    45     void CsgUnion()     { MeshCsg(CSG_UNION); }
    46     void CsgSubstract() { MeshCsg(CSG_SUBSTRACT); }
    47     void CsgAnd()       { MeshCsg(CSG_AND); }
    48     void CsgXor()       { MeshCsg(CSG_XOR); }
     62    void CsgUnion()         { MeshCsg(CSGUsage::Union); }
     63    void CsgSubstract()     { MeshCsg(CSGUsage::Substract); }
     64    void CsgSubstractLoss() { MeshCsg(CSGUsage::SubstractLoss); }
     65    void CsgAnd()           { MeshCsg(CSGUsage::And); }
     66    void CsgXor()           { MeshCsg(CSGUsage::Xor); }
    4967
    5068public:
     
    6684    void SetVertColor(vec4 const &color);
    6785
    68 public:
    6986    void SetCurVertNormal(vec3 const &normal);
    7087    void SetCurVertColor(vec4 const &color);
    7188
    72     void RadialJitter(float r);
    73 
     89public:
     90    //-------------------------------------------------------------------------
     91    //Mesh transform operations
     92    //-------------------------------------------------------------------------
    7493    void Translate(vec3 const &v);
    7594    void RotateX(float t);
     
    7796    void RotateZ(float t);
    7897    void Rotate(float t, vec3 const &axis);
     98    void RadialJitter(float r);
    7999    void TaperX(float y, float z, float xoff);
    80100    void TaperY(float x, float z, float yoff);
     
    87107    void Chamfer(float f);
    88108
     109    //-------------------------------------------------------------------------
     110    //Mesh shape operations
     111    //-------------------------------------------------------------------------
    89112    void AppendCylinder(int nsides, float h, float r1, float r2,
    90113                        int dualside, int smooth);
     
    106129                   float r2, float r12, float r22, float sidemul, int offset);
    107130
     131    //-------------------------------------------------------------------------
     132    //TODO : Mesh Bone operations
     133    //-------------------------------------------------------------------------
     134    //void AddBone(int parent_id) {}
     135
    108136    //Convenience functions
    109137public:
     
    114142    vec4 m_color, m_color2;
    115143    Array<uint16_t> m_indices;
     144    //TODO : <coord, norm, color, bone_id, bone_weight>
     145    //TODO : Array<vec3, vec3, vec4, ivec2, vec2> m_vert;
     146    //TODO : More bone blend support than 2 ?
    116147    //<coord, norm, color>
    117148    Array<vec3, vec3, vec4> m_vert;
    118149    //<vert count, indices count>
    119150    Array<int, int> m_cursors;
     151    //When this flag is up, negative scaling will not invert faces.
    120152    bool m_ignore_winding_on_scale;
    121153
Note: See TracChangeset for help on using the changeset viewer.