Changeset 2438


Ignore:
Timestamp:
Feb 18, 2013, 11:20:11 PM (6 years ago)
Author:
touky
Message:

easymesh : Bitfield big Fuckup. Never code drunk.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/easymesh/easymesh.cpp

    r2430 r2438  
    103103    bool with_UV = false;
    104104    m_render_mode = render_mode;
    105     m_vert_decl_flags = (VertexUsage::Position << 1) |
    106                         (VertexUsage::Normal << 1)   |
    107                         (VertexUsage::Color << 1);
     105    m_vert_decl_flags = (1 << VertexUsage::Position) |
     106                        (1 << VertexUsage::Normal)   |
     107                        (1 << VertexUsage::Color);
    108108
    109109    if (render_mode == DebugRenderMode::Default)
     
    118118    {
    119119        m_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinydebugUV));
    120         m_vert_decl_flags |= (VertexUsage::TexCoord << 1);
     120        m_vert_decl_flags |= (1 << VertexUsage::TexCoord);
    121121        with_UV = true;
    122122    }
     
    242242    new_vbo->Unlock();
    243243
    244     if (vdecl_flags ==  ((VertexUsage::Position<<1) | (VertexUsage::Normal<<1) |
    245                          (VertexUsage::Color<<1)    | (VertexUsage::TexCoord<<1)))
     244    if (vdecl_flags == ((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     245                        (1 << VertexUsage::Color)    | (1 << VertexUsage::TexCoordExt)))
     246    {
     247        new_vdecl = new VertexDeclaration(
     248                         VertexStream<vec3,vec3,u8vec4,vec4>(
     249                          VertexUsage::Position,
     250                          VertexUsage::Normal,
     251                          VertexUsage::Color,
     252                          VertexUsage::TexCoord));
     253
     254        Array<vec3, vec3, u8vec4, vec4> vertexlist;
     255        for (int i = 0; i < src_mesh->m_vert.Count(); i++)
     256            vertexlist.Push(src_mesh->m_vert[i].m_coord,
     257                            src_mesh->m_vert[i].m_normal,
     258                            (u8vec4)(src_mesh->m_vert[i].m_color * 255.f),
     259                            src_mesh->m_vert[i].m_texcoord);
     260
     261        vbo_data = &vertexlist[0];
     262        vbo_bytes = vertexlist.Bytes();
     263        m_vertexcount = vertexlist.Count();
     264
     265        COPY_VBO;
     266    }
     267    else if (vdecl_flags ==  ((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     268                              (1 << VertexUsage::Color)    | (1 << VertexUsage::TexCoord)))
    246269    {
    247270        new_vdecl = new VertexDeclaration(
     
    265288        COPY_VBO;
    266289    }
    267     else if (vdecl_flags == ((VertexUsage::Position<<1) | (VertexUsage::Normal<<1) |
    268                              (VertexUsage::Color<<1)    | (VertexUsage::TexCoordExt<<1)))
    269     {
    270         new_vdecl = new VertexDeclaration(
    271                          VertexStream<vec3,vec3,u8vec4,vec4>(
    272                           VertexUsage::Position,
    273                           VertexUsage::Normal,
    274                           VertexUsage::Color,
    275                           VertexUsage::TexCoord));
    276 
    277         Array<vec3, vec3, u8vec4, vec4> vertexlist;
    278         for (int i = 0; i < src_mesh->m_vert.Count(); i++)
    279             vertexlist.Push(src_mesh->m_vert[i].m_coord,
    280                             src_mesh->m_vert[i].m_normal,
    281                             (u8vec4)(src_mesh->m_vert[i].m_color * 255.f),
    282                             src_mesh->m_vert[i].m_texcoord);
    283 
    284         vbo_data = &vertexlist[0];
    285         vbo_bytes = vertexlist.Bytes();
    286         m_vertexcount = vertexlist.Count();
    287 
    288         COPY_VBO;
    289     }
    290     else if (vdecl_flags ==  ((VertexUsage::Position<<1) | (VertexUsage::Normal<<1) |
    291                               (VertexUsage::Color<<1)))
     290    else if (vdecl_flags ==  ((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     291                              (1 << VertexUsage::Color)))
    292292    {
    293293        new_vdecl = new VertexDeclaration(
     
    336336    vdecl->Bind();
    337337
    338     if (vflags == ((VertexUsage::Position<<1) | (VertexUsage::Normal<<1) |
    339                    (VertexUsage::Color<<1)    | (VertexUsage::TexCoord<<1)))
     338    if (vflags == ((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     339                   (1 << VertexUsage::Color)    | (1 << VertexUsage::TexCoord)))
    340340    {
    341341        vdecl->SetStream(vbo, *gpu_sd.GetAttribute(lol::String("in_Vertex")),
     
    344344                              *gpu_sd.GetAttribute(lol::String("in_TexCoord")));
    345345    }
    346     else if (vflags == ((VertexUsage::Position<<1) | (VertexUsage::Normal<<1) |
    347                         (VertexUsage::Color<<1)))
     346    else if (vflags == ((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     347                        (1 << VertexUsage::Color)))
    348348    {
    349349        vdecl->SetStream(vbo, *gpu_sd.GetAttribute(lol::String("in_Vertex")),
     
    360360//-----------------------------------------------------------------------------
    361361EasyMesh::EasyMesh()
    362   : m_color(0), m_color2(0), m_ignore_winding_on_scale(0),
    363     m_texcoord_offset(vec2(.0f)), m_texcoord_scale(vec2(1.f))
     362  : m_build_data(NULL)
    364363{
    365364    m_cursors.Push(0, 0);
     
    370369{
    371370    EasyMeshCompiler mc(*this);
    372     return mc.ParseString(command);
     371    bool res = mc.ParseString(command);
     372    delete(m_build_data);
     373    return res;
    373374}
    374375
     
    400401    if (provided_shader)
    401402    {
    402         GpuShaderData *new_gpu_sdata = new DefaultShaderData(((VertexUsage::Position<<1) |
    403                                                               (VertexUsage::Normal<<1) |
    404                                                               (VertexUsage::Color<<1)),
     403        GpuShaderData *new_gpu_sdata = new DefaultShaderData(((1 << VertexUsage::Position) |
     404                                                              (1 << VertexUsage::Normal) |
     405                                                              (1 << VertexUsage::Color)),
    405406                                                              provided_shader,
    406407                                                              false);
     
    767768void EasyMesh::ToggleScaleWinding()
    768769{
    769     m_ignore_winding_on_scale = !m_ignore_winding_on_scale;
     770    BD()->Toggle(MeshBuildOperation::Scale_Winding);
    770771}
    771772
     
    773774void EasyMesh::SetCurColor(vec4 const &color)
    774775{
    775     m_color = color;
     776    BD()->Color() = color;
    776777}
    777778
     
    779780void EasyMesh::SetCurColor2(vec4 const &color)
    780781{
    781     m_color2 = color;
     782    BD()->Color2() = color;
    782783}
    783784
     
    785786void EasyMesh::AddVertex(vec3 const &coord)
    786787{
    787     m_vert.Push(VertexData(coord, vec3(0.f, 1.f, 0.f), m_color));
     788    m_vert.Push(VertexData(coord, vec3(0.f, 1.f, 0.f), BD()->Color()));
    788789}
    789790
     
    10551056void EasyMesh::SetTexCoordData(vec2 const &new_offset, vec2 const &new_scale)
    10561057{
    1057     m_texcoord_offset = new_offset;
    1058     m_texcoord_scale = new_scale;
     1058    BD()->TexCoordOffset() = new_offset;
     1059    BD()->TexCoordScale() = new_scale;
     1060}
     1061
     1062//-----------------------------------------------------------------------------
     1063void EasyMesh::SetTexCoordData2(vec2 const &new_offset, vec2 const &new_scale)
     1064{
     1065    BD()->TexCoordOffset2() = new_offset;
     1066    BD()->TexCoordScale2() = new_scale;
    10591067}
    10601068
     
    10781086
    10791087//-----------------------------------------------------------------------------
    1080 void EasyMesh::SetCurVertTexCoord(vec4 const &texcoord)
    1081 {
    1082     m_vert[m_vert.Count() - 1].m_texcoord = texcoord;
     1088void EasyMesh::SetCurVertTexCoord2(vec2 const &texcoord)
     1089{
     1090    m_vert[m_vert.Count() - 1].m_texcoord = vec4(m_vert[m_vert.Count() - 1].m_texcoord.xy, texcoord);
    10831091}
    10841092
     
    12381246
    12391247    /* Flip winding if the scaling involves mirroring */
    1240     if (!m_ignore_winding_on_scale && s.x * s.y * s.z < 0)
     1248    if (!BD()->IsEnabled(MeshBuildOperation::Scale_Winding) && s.x * s.y * s.z < 0)
    12411249    {
    12421250        for (int i = m_cursors.Last().m2; i < m_indices.Count(); i += 3)
     
    12811289
    12821290    //SAVE
    1283     vec4 Saved_Color = m_color;
    1284     vec4 Saved_Color2 = m_color2;
    1285     vec2 Save_texcoord_offset = m_texcoord_offset;
    1286     vec2 Save_texcoord_scale = m_texcoord_scale;
     1291    vec4 Saved_Color = BD()->Color();
     1292    vec4 Saved_Color2 = BD()->Color2();
     1293    vec2 Save_texcoord_offset = BD()->TexCoordOffset();
     1294    vec2 Save_texcoord_scale = BD()->TexCoordScale();
    12871295
    12881296    int vbase = m_vert.Count();
     
    13081316    for (int i = 0; i < nsides; i++)
    13091317    {
    1310         AddVertex(p1); SetCurVertNormal(n); SetCurVertTexCoord(uv1);
    1311         AddVertex(p2); SetCurVertNormal(n); SetCurVertTexCoord(uv2);
    1312         SetCurVertColor(m_color2);
     1318        AddVertex(p1); SetCurVertNormal(n); SetCurVertTexCoord(uv1); SetCurVertTexCoord2(uv1);
     1319        AddVertex(p2); SetCurVertNormal(n); SetCurVertTexCoord(uv2); SetCurVertTexCoord2(uv2);
     1320        SetCurVertColor(BD()->Color2());
    13131321
    13141322        if (smooth)
     
    13251333        if (!smooth)
    13261334        {
    1327             AddVertex(p1); SetCurVertNormal(n); SetCurVertTexCoord(uv1);
    1328             AddVertex(p2); SetCurVertNormal(n); SetCurVertTexCoord(uv2);
    1329             SetCurVertColor(m_color2);
     1335            AddVertex(p1); SetCurVertNormal(n); SetCurVertTexCoord(uv1); SetCurVertTexCoord2(uv1);
     1336            AddVertex(p2); SetCurVertNormal(n); SetCurVertTexCoord(uv2); SetCurVertTexCoord2(uv2);
     1337            SetCurVertColor(BD()->Color2());
    13301338
    13311339            AppendQuad(i * 4 + 2, i * 4 + 3, i * 4 + 1, i * 4, vbase);
     
    13431351        //LOWER DISC
    13441352        SetTexCoordData(vec2(.0f, .5f), vec2(.5f, .5f));
    1345         SetCurColor(m_color);
     1353        SetCurColor(BD()->Color());
    13461354        AppendDisc(nsides, d1);
    13471355        Translate(vec3(.0f, h, .0f));
     
    13491357        //UPPER DISC
    13501358        SetTexCoordData(vec2(.5f, .5f), vec2(.5f, .5f));
    1351         SetCurColor(m_color2);
     1359        SetCurColor(BD()->Color2());
    13521360        AppendDisc(nsides, d2);
    13531361        Translate(vec3(.0f, h * .5f, .0f));
     
    14931501                            new_uv = uv[rid[0]];
    14941502                        SetCurVertTexCoord(vec2(0.f, 1.f) - new_uv);
     1503                        SetCurVertTexCoord2(vec2(0.f, 1.f) - new_uv);
    14951504                    }
    14961505                    AppendTriangle(0, 2, 1, m_vert.Count() - 3);
     
    15461555            AddVertex(vec3(x2, y, z2));
    15471556            SetCurVertTexCoord(vec2((float)(i + di) / (float)nidiv, (float)(j + dj) / (float)nidiv));
     1557            SetCurVertTexCoord2(vec2((float)(i + di) / (float)nidiv, (float)(j + dj) / (float)nidiv));
    15481558        }
    15491559
     
    15871597    vec3 d = size * 0.5f;
    15881598
     1599    MeshType mt = MeshType::Box;
     1600    TexCoordPos bl = TexCoordPos::BL;
     1601    TexCoordPos br = TexCoordPos::BR;
     1602    TexCoordPos tl = TexCoordPos::TL;
     1603    TexCoordPos tr = TexCoordPos::TR;
     1604
     1605    //--
    15891606    //Side vertices
     1607    //--
     1608    MeshFaceType mft = MeshFaceType::BoxFront;
    15901609    AddVertex(vec3(-d.x, -d.y, -d.z - chamf));
    1591     SetCurVertTexCoord(vec2(0.f, .5f));
     1610    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1611    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1612    //--
    15921613    AddVertex(vec3(-d.x, +d.y, -d.z - chamf));
    1593     SetCurVertTexCoord(vec2(0.f, 0.f));
     1614    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1615    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1616    //--
    15941617    AddVertex(vec3(+d.x, +d.y, -d.z - chamf));
    1595     SetCurVertTexCoord(vec2(.5f, 0.f));
     1618    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1619    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1620    //--
    15961621    AddVertex(vec3(+d.x, -d.y, -d.z - chamf));
    1597     SetCurVertTexCoord(vec2(.5f, .5f));
    1598 
     1622    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1623    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1624
     1625    //--
     1626    mft = MeshFaceType::BoxLeft;
    15991627    AddVertex(vec3(-d.x - chamf, -d.y, +d.z));
    1600     SetCurVertTexCoord(vec2(.5f, 0.5f));
     1628    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1629    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1630    //--
    16011631    AddVertex(vec3(-d.x - chamf, +d.y, +d.z));
    1602     SetCurVertTexCoord(vec2(.5f, 0.f));
     1632    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1633    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1634    //--
    16031635    AddVertex(vec3(-d.x - chamf, +d.y, -d.z));
    1604     SetCurVertTexCoord(vec2(1.f, 0.f));
     1636    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1637    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1638    //--
    16051639    AddVertex(vec3(-d.x - chamf, -d.y, -d.z));
    1606     SetCurVertTexCoord(vec2(1.f, .5f));
    1607 
     1640    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1641    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1642
     1643    //--
     1644    mft = MeshFaceType::BoxBack;
    16081645    AddVertex(vec3(+d.x, -d.y, +d.z + chamf));
    1609     SetCurVertTexCoord(vec2(0.f, .5f));
     1646    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1647    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1648    //--
    16101649    AddVertex(vec3(+d.x, +d.y, +d.z + chamf));
    1611     SetCurVertTexCoord(vec2(0.f, 0.f));
     1650    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1651    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1652    //--
    16121653    AddVertex(vec3(-d.x, +d.y, +d.z + chamf));
    1613     SetCurVertTexCoord(vec2(.5f, 0.f));
     1654    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1655    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1656    //--
    16141657    AddVertex(vec3(-d.x, -d.y, +d.z + chamf));
    1615     SetCurVertTexCoord(vec2(.5f, .5f));
    1616 
     1658    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1659    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1660
     1661    //--
     1662    mft = MeshFaceType::BoxRight;
    16171663    AddVertex(vec3(+d.x + chamf, -d.y, -d.z));
    1618     SetCurVertTexCoord(vec2(.5f, .5f));
     1664    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1665    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1666    //--
    16191667    AddVertex(vec3(+d.x + chamf, +d.y, -d.z));
    1620     SetCurVertTexCoord(vec2(.5f, .0f));
     1668    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1669    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1670    //--
    16211671    AddVertex(vec3(+d.x + chamf, +d.y, +d.z));
    1622     SetCurVertTexCoord(vec2(1.f, .0f));
     1672    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1673    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1674    //--
    16231675    AddVertex(vec3(+d.x + chamf, -d.y, +d.z));
    1624     SetCurVertTexCoord(vec2(1.f, .5f));
    1625 
     1676    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1677    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1678
     1679    //--
    16261680    //Bottom vertices
     1681    //--
     1682    mft = MeshFaceType::BoxBottom;
    16271683    AddVertex(vec3(-d.x, -d.y - chamf, +d.z));
    1628     SetCurVertTexCoord(vec2(.5f, 1.f));
     1684    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1685    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1686    //--
    16291687    AddVertex(vec3(-d.x, -d.y - chamf, -d.z));
    1630     SetCurVertTexCoord(vec2(.5f, .5f));
     1688    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1689    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1690    //--
    16311691    AddVertex(vec3(+d.x, -d.y - chamf, -d.z));
    1632     SetCurVertTexCoord(vec2(.0f, .5f));
     1692    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1693    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1694    //--
    16331695    AddVertex(vec3(+d.x, -d.y - chamf, +d.z));
    1634     SetCurVertTexCoord(vec2(.0f, 1.f));
    1635 
     1696    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1697    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1698
     1699    //--
    16361700    //Top vertices
     1701    //--
     1702    mft = MeshFaceType::BoxTop;
    16371703    AddVertex(vec3(-d.x, +d.y + chamf, -d.z));
    1638     SetCurVertTexCoord(vec2(1.f, 1.f));
     1704    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1705    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1706    //--
    16391707    AddVertex(vec3(-d.x, +d.y + chamf, +d.z));
    1640     SetCurVertTexCoord(vec2(1.f, .5f));
     1708    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1709    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1710    //--
    16411711    AddVertex(vec3(+d.x, +d.y + chamf, +d.z));
    1642     SetCurVertTexCoord(vec2(.5f, .5f));
     1712    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1713    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1714    //--
    16431715    AddVertex(vec3(+d.x, +d.y + chamf, -d.z));
    1644     SetCurVertTexCoord(vec2(.5f, 1.f));
     1716    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1717    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
    16451718
    16461719    /* The 6 quads on each side of the box */
     
    17081781    float maxr = max(r1, r2);
    17091782
    1710     AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f));
     1783    AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f)); SetCurVertTexCoord2(vec2(.5f, .5f));
    17111784
    17121785    mat3 rotmat = mat3::rotate(180.0f / nbranches, 0.f, 1.f, 0.f);
     
    17201793    for (int i = 0; i < nbranches; i++)
    17211794    {
    1722         AddVertex(p1); SetCurVertTexCoord(uv1.xz + vec2(.5f));
     1795        AddVertex(p1); SetCurVertTexCoord(uv1.xz + vec2(.5f)); SetCurVertTexCoord2(uv1.xz + vec2(.5f));
    17231796        if (fade2)
    1724             SetCurVertColor(m_color2);
    1725 
    1726         AddVertex(p2); SetCurVertTexCoord(uv2.xz + vec2(.5f));
     1797            SetCurVertColor(BD()->Color2());
     1798
     1799        AddVertex(p2); SetCurVertTexCoord(uv2.xz + vec2(.5f)); SetCurVertTexCoord2(uv2.xz + vec2(.5f));
    17271800        if (fade)
    1728             SetCurVertColor(m_color2);
     1801            SetCurVertColor(BD()->Color2());
    17291802
    17301803        AppendQuad(0, 2 * i + 1, 2 * i + 2, (2 * i + 3) % (2 * nbranches),
     
    17471820    float maxr = (float)max(max(r1, r2), max(r1 + extrar, r2 + extrar));
    17481821
    1749     AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f));
     1822    AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f)); SetCurVertTexCoord2(vec2(.5f, .5f));
    17501823
    17511824    mat3 rotmat = mat3::rotate(180.0f / nbranches, 0.f, 1.f, 0.f);
     
    17631836    for (int i = 0; i < nbranches; i++)
    17641837    {
    1765         AddVertex(p1); SetCurVertTexCoord(uv1.xz + vec2(.5f));
    1766         AddVertex(p2); SetCurVertTexCoord(uv2.xz + vec2(.5f));
    1767         AddVertex(p3); SetCurVertTexCoord(uv3.xz + vec2(.5f)); SetCurVertColor(m_color2);
    1768         AddVertex(p4); SetCurVertTexCoord(uv4.xz + vec2(.5f)); SetCurVertColor(m_color2);
     1838        AddVertex(p1); SetCurVertTexCoord(uv1.xz + vec2(.5f)); SetCurVertTexCoord2(uv1.xz + vec2(.5f));
     1839        AddVertex(p2); SetCurVertTexCoord(uv2.xz + vec2(.5f)); SetCurVertTexCoord2(uv2.xz + vec2(.5f));
     1840        AddVertex(p3); SetCurVertTexCoord(uv3.xz + vec2(.5f)); SetCurVertTexCoord2(uv3.xz + vec2(.5f)); SetCurVertColor(BD()->Color2());
     1841        AddVertex(p4); SetCurVertTexCoord(uv4.xz + vec2(.5f)); SetCurVertTexCoord2(uv4.xz + vec2(.5f)); SetCurVertColor(BD()->Color2());
    17691842
    17701843        int j = (i + 1) % nbranches;
     
    17881861    int vbase = m_vert.Count();
    17891862
    1790     AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f));
     1863    AddVertex(vec3(0.f, 0.f, 0.f)); SetCurVertTexCoord(vec2(.5f, .5f)); SetCurVertTexCoord2(vec2(.5f, .5f));
    17911864
    17921865    mat3 rotmat = mat3::rotate(360.0f / nsides, 0.f, 1.f, 0.f);
     
    17961869    for (int i = 0; i < nsides; i++)
    17971870    {
    1798         AddVertex(p1); SetCurVertTexCoord(uv.xz + vec2(.5f, .5f));
     1871        AddVertex(p1); SetCurVertTexCoord(uv.xz + vec2(.5f, .5f)); SetCurVertTexCoord2(uv.xz + vec2(.5f, .5f));
    17991872        if (fade)
    1800             SetCurVertColor(m_color2);
     1873            SetCurVertColor(BD()->Color2());
    18011874        AppendTriangle(0, i + 1, ((i + 1) % nsides) + 1, vbase);
    18021875        p1 = rotmat * p1;
     
    18141887    vec3 p(0.f, 0.f, size);
    18151888
    1816     AddVertex(p); SetCurVertTexCoord(vec2(.5f, 0.133975f));
     1889    AddVertex(p); SetCurVertTexCoord(vec2(.5f, 0.133975f)); SetCurVertTexCoord2(vec2(.5f, 0.133975f));
    18171890    p = m * p;
    1818     AddVertex(p); SetCurVertTexCoord(vec2(0.f, 1.f));
     1891    AddVertex(p); SetCurVertTexCoord(vec2(0.f, 1.f)); SetCurVertTexCoord2(vec2(0.f, 1.f));
    18191892    if (fade)
    1820         SetCurVertColor(m_color2);
     1893        SetCurVertColor(BD()->Color2());
    18211894    p = m * p;
    1822     AddVertex(p); SetCurVertTexCoord(vec2(1.f, 1.f));
     1895    AddVertex(p); SetCurVertTexCoord(vec2(1.f, 1.f)); SetCurVertTexCoord2(vec2(1.f, 1.f));
    18231896    if (fade)
    1824         SetCurVertColor(m_color2);
     1897        SetCurVertColor(BD()->Color2());
    18251898
    18261899    AppendTriangle(0, 1, 2, m_vert.Count() - 3);
     
    18361909void EasyMesh::AppendSimpleQuad(vec2 p1, vec2 p2, float z, int fade)
    18371910{
    1838     AddVertex(vec3(p2.x, z, -p1.y)); SetCurVertTexCoord(vec2(1.f, 0.f));
    1839     AddVertex(vec3(p2.x, z, -p2.y)); SetCurVertTexCoord(vec2(0.f, 0.f));
    1840     AddVertex(vec3(p1.x, z, -p2.y)); SetCurVertTexCoord(vec2(0.f, 1.f));
    1841     if (fade) SetCurVertColor(m_color2);
    1842     AddVertex(vec3(p1.x, z, -p1.y)); SetCurVertTexCoord(vec2(1.f, 1.f));
    1843     if (fade) SetCurVertColor(m_color2);
     1911    MeshType mt = MeshType::Quad;
     1912    MeshFaceType mft = MeshFaceType::QuadDefault;
     1913
     1914    //--
     1915    AddVertex(vec3(p2.x, z, -p1.y));
     1916    TexCoordPos br = TexCoordPos::BR;
     1917    SetCurVertTexCoord(BD()->TexCoord(mt, br, mft));
     1918    SetCurVertTexCoord2(BD()->TexCoord2(mt, br, mft));
     1919    //--
     1920    AddVertex(vec3(p2.x, z, -p2.y));
     1921    TexCoordPos bl = TexCoordPos::BL;
     1922    SetCurVertTexCoord(BD()->TexCoord(mt, bl, mft));
     1923    SetCurVertTexCoord2(BD()->TexCoord2(mt, bl, mft));
     1924    //--
     1925    AddVertex(vec3(p1.x, z, -p2.y));
     1926    TexCoordPos tl = TexCoordPos::TL;
     1927    SetCurVertTexCoord(BD()->TexCoord(mt, tl, mft));
     1928    SetCurVertTexCoord2(BD()->TexCoord2(mt, tl, mft));
     1929    if (fade) SetCurVertColor(BD()->Color2());
     1930    //--
     1931    AddVertex(vec3(p1.x, z, -p1.y));
     1932    TexCoordPos tr = TexCoordPos::TR;
     1933    SetCurVertTexCoord(BD()->TexCoord(mt, tr, mft));
     1934    SetCurVertTexCoord2(BD()->TexCoord2(mt, tr, mft));
     1935    if (fade) SetCurVertColor(BD()->Color2());
    18441936
    18451937    AppendQuad(0, 1, 2, 3, m_vert.Count() - 4);
     
    20662158                    add = upadd;
    20672159                SetCurVertTexCoord(tmp * vec2(.25f) + add);
     2160                SetCurVertTexCoord2(tmp * vec2(.25f) + add);
    20682161            }
    20692162            else if (m == 0 || m == 1) //inner Logic
     2163            {
    20702164                SetCurVertTexCoord(uv[d]);
     2165                SetCurVertTexCoord2(uv[d]);
     2166            }
    20712167            else //Cog logic
    20722168            {
    20732169                if (m == 2 && n % 3 == 2)
     2170                {
    20742171                    SetCurVertTexCoord(vec2(1.f, (d == 2)?(0.f):(1.f)) * CogUV[0] + CogUV[1]);
     2172                    SetCurVertTexCoord2(vec2(1.f, (d == 2)?(0.f):(1.f)) * CogUV[0] + CogUV[1]);
     2173                }
    20752174                else
     2175                {
    20762176                    SetCurVertTexCoord(uv[d]);
     2177                    SetCurVertTexCoord2(uv[d]);
     2178                }
    20772179            }
    20782180            if (d >= 6)
    2079                 SetCurVertColor(m_color2);
     2181                SetCurVertColor(BD()->Color2());
    20802182        }
    20812183
  • trunk/src/easymesh/easymesh.h

    r2430 r2438  
    110110};
    111111
     112
     113struct MeshBuildOperation
     114{
     115    enum Value
     116    {
     117        //When this flag is up, negative scaling will not invert faces.
     118        Scale_Winding   = 1 << 0,
     119
     120        All     = 0xffffffff
     121    }
     122    m_value;
     123
     124    inline MeshBuildOperation(Value v) : m_value(v) {}
     125    inline MeshBuildOperation(uint64_t i) : m_value((Value)i) {}
     126    inline operator Value() { return m_value; }
     127};
     128
     129struct MeshType
     130{
     131    enum Value
     132    {
     133        Triangle = 0,
     134        Quad,
     135        Box,
     136        Sphere,
     137        Capsule,
     138        Torus,
     139        Cylinder,
     140        Disc,
     141        Star,
     142        ExpandedStar,
     143        Cog,
     144
     145        Max
     146    }
     147    m_value;
     148
     149    inline MeshType(Value v) : m_value(v) {}
     150    inline operator Value() { return m_value; }
     151};
     152
     153//TODO : Add other Build type
     154struct TexCoordBuildType
     155{
     156    enum Value
     157    {
     158        TriangleDefault     = 0,
     159        QuadDefault         = 0,
     160        BoxDefault          = 0,
     161        SphereDefault       = 0,
     162        CapsuleDefault      = 0,
     163        TorusDefault        = 0,
     164        CylinderDefault     = 0,
     165        DiscDefault         = 0,
     166        StarDefault         = 0,
     167        ExpandedStarDefault = 0,
     168        CogDefault          = 0,
     169
     170        Max
     171    }
     172    m_value;
     173
     174    inline TexCoordBuildType() : m_value(TriangleDefault) {}
     175    inline TexCoordBuildType(Value v) : m_value(v) {}
     176    inline TexCoordBuildType(int v) : m_value((Value)v) {}
     177    inline operator Value() { return m_value; }
     178};
     179
     180struct MeshFaceType
     181{
     182    enum Value
     183    {
     184        BoxFront = 0,
     185        BoxLeft  = 1,
     186        BoxBack  = 2,
     187        BoxRight = 3,
     188        BoxTop    = 4,
     189        BoxBottom  = 5,
     190        QuadDefault = 0,
     191
     192        Max
     193    }
     194    m_value;
     195
     196    inline MeshFaceType(Value v) : m_value(v) {}
     197    inline operator Value() { return m_value; }
     198};
     199
     200struct TexCoordPos
     201{
     202    enum Value
     203    {
     204        BL, //BottomLeft
     205        BR, //BottomRight
     206        TL, //TopLeft
     207        TR  //TopRight
     208    }
     209    m_value;
     210
     211    inline TexCoordPos(Value v) : m_value(v) {}
     212    inline operator Value() { return m_value; }
     213};
     214
     215class EasyMeshBuildData
     216{
     217public:
     218    EasyMeshBuildData()
     219    {
     220        m_color = vec4(0.f, 0.f, 0.f, 1.f);
     221        m_color2 = vec4(0.f, 0.f, 0.f, 1.f);
     222        m_texcoord_offset = vec2(0.f);
     223        m_texcoord_offset2 = vec2(0.f);
     224        m_texcoord_scale = vec2(1.f);
     225        m_texcoord_scale2 = vec2(1.f);
     226        m_build_flags = 0;
     227        for (int i = 0; i < MeshType::Max; ++i)
     228        {
     229            m_texcoord_build_type[i] = TexCoordBuildType::TriangleDefault;
     230            m_texcoord_build_type2[i] = TexCoordBuildType::TriangleDefault;
     231        }
     232    }
     233
     234    inline vec4 &Color()           { return m_color; }
     235    inline vec4 &Color2()          { return m_color2; }
     236    inline vec2 &TexCoordOffset()  { return m_texcoord_offset; }
     237    inline vec2 &TexCoordScale()   { return m_texcoord_scale; }
     238    inline vec2 &TexCoordOffset2() { return m_texcoord_offset2; }
     239    inline vec2 &TexCoordScale2()  { return m_texcoord_scale2; }
     240
     241    //UV1
     242    void SetTexCoordBuildType(MeshType mt, TexCoordBuildType tcbt) { m_texcoord_build_type[mt] = (1 << (tcbt + 1)) | (m_texcoord_build_type[mt] & 1); }
     243    TexCoordBuildType GetTexCoordBuildType(MeshType mt)
     244    {
     245        int flag = ((m_texcoord_build_type[mt] & ~(1)) >> 1);
     246        int i = 0;
     247        while (flag >>= 1)
     248            i++;
     249        return TexCoordBuildType(i);
     250    }
     251    void SetTexCoordCustomBuild(MeshType mt, MeshFaceType face, vec2 BL, vec2 TR)
     252    {
     253        if (face >= m_texcoord_custom_build[mt].Count())
     254            m_texcoord_custom_build[mt].Resize(face + 1);
     255        m_texcoord_custom_build[mt][face].m1 = BL;
     256        m_texcoord_custom_build[mt][face].m2 = TR;
     257        m_texcoord_build_type[mt] |= 1;
     258    }
     259    void ClearTexCoordCustomBuild(MeshType mt) { m_texcoord_build_type[mt] &= ~1; }
     260    /* FIXME : Do something better ? */
     261    vec2 TexCoord(MeshType mt, TexCoordPos tcp, MeshFaceType face)
     262    {
     263        vec2 BL = vec2(0.f);
     264        vec2 TR = vec2(0.f);
     265        if (m_texcoord_build_type[mt] & 1 && face < m_texcoord_custom_build[mt].Count())
     266        {
     267            BL = m_texcoord_custom_build[mt][face].m1;
     268            TR = m_texcoord_custom_build[mt][face].m2;
     269        }
     270        else
     271        {
     272            TexCoordBuildType tcbt = GetTexCoordBuildType(mt);
     273            if (mt == MeshType::Triangle)
     274                mt = mt;
     275            else if (mt == MeshType::Quad)
     276            {
     277                //There's nothin' else than QuadDefault
     278                BL = vec2(0.f);
     279                TR = vec2(1.f);
     280            }
     281            else if (mt == MeshType::Box)
     282            {
     283                vec2 data[][2] =
     284                { //TexCoordBuildType::BoxDefault
     285                    { vec2(0.f), vec2(.5f) },
     286                    { vec2(.5f, 0.f), vec2(1.f, .5f) },
     287                    { vec2(0.f), vec2(.5f) },
     288                    { vec2(.5f, 0.f), vec2(1.f, .5f) },
     289                    { vec2(0.f, .5f), vec2(.5f, 1.f) },
     290                    { vec2(.5f, .5f), vec2(1.f, 1.f) }
     291                };
     292                BL = data[face][0]; //[tcbt]
     293                TR = data[face][1]; //[tcbt]
     294            }
     295            else if (mt == MeshType::Sphere)
     296                mt = mt;
     297            else if (mt == MeshType::Capsule)
     298                mt = mt;
     299            else if (mt == MeshType::Torus)
     300                mt = mt;
     301            else if (mt == MeshType::Cylinder)
     302                mt = mt;
     303            else if (mt == MeshType::Disc)
     304                mt = mt;
     305            else if (mt == MeshType::Star)
     306                mt = mt;
     307            else if (mt == MeshType::ExpandedStar)
     308                mt = mt;
     309            else if (mt == MeshType::Cog)
     310                mt = mt;
     311        }
     312
     313        vec2 res = vec2(.0f);
     314        if (tcp == TexCoordPos::BL)
     315            res = BL;
     316        else if (tcp == TexCoordPos::BR)
     317            res = vec2(TR.x, BL.y);
     318        else if (tcp == TexCoordPos::TL)
     319            res = vec2(BL.x, TR.y);
     320        else if (tcp == TexCoordPos::TR)
     321            res = TR;
     322
     323        return res * m_texcoord_scale + m_texcoord_offset2;
     324    }
     325
     326    //UV2
     327    void SetTexCoordBuildType2(MeshType mt, TexCoordBuildType tcbt) { m_texcoord_build_type2[mt] = (1 << (tcbt + 1)) | (m_texcoord_build_type2[mt] & 1); }
     328    TexCoordBuildType GetTexCoordBuildType2(MeshType mt)
     329    {
     330        int flag = ((m_texcoord_build_type2[mt] & ~(1)) >> 1);
     331        int i = 0;
     332        while (flag >>= 1)
     333            i++;
     334        return TexCoordBuildType(i);
     335    }
     336    void SetTexCoordCustomBuild2(MeshType mt, MeshFaceType face, vec2 BL, vec2 TR)
     337    {
     338        if (face >= m_texcoord_custom_build2[mt].Count())
     339            m_texcoord_custom_build2[mt].Resize(face + 1);
     340        m_texcoord_custom_build2[mt][face].m1 = BL;
     341        m_texcoord_custom_build2[mt][face].m2 = TR;
     342        m_texcoord_build_type2[mt] |= 1;
     343    }
     344    void ClearTexCoordCustomBuild2(MeshType mt) { m_texcoord_build_type2[mt] &= ~1; }
     345    vec2 TexCoord2(MeshType mt, TexCoordPos tcp, MeshFaceType face)
     346    {
     347        vec2 BL = vec2(0.f);
     348        vec2 TR = vec2(0.f);
     349        if (m_texcoord_build_type2[mt] & 1 && face < m_texcoord_custom_build2[mt].Count())
     350        {
     351            BL = m_texcoord_custom_build2[mt][face].m1;
     352            TR = m_texcoord_custom_build2[mt][face].m2;
     353        }
     354        else
     355        {
     356            TexCoordBuildType tcbt = GetTexCoordBuildType2(mt);
     357            if (mt == MeshType::Triangle)
     358                mt = mt;
     359            else if (mt == MeshType::Quad)
     360            {
     361                //There's nothin' else than QuadDefault
     362                BL = vec2(0.f);
     363                TR = vec2(1.f);
     364            }
     365            else if (mt == MeshType::Box)
     366            {
     367                vec2 data[][2] =
     368                { //TexCoordBuildType::BoxDefault
     369                    { vec2(0.f), vec2(.5f) },
     370                    { vec2(.5f, 0.f), vec2(1.f, .5f) },
     371                    { vec2(0.f), vec2(.5f) },
     372                    { vec2(.5f, 0.f), vec2(1.f, .5f) },
     373                    { vec2(0.f, .5f), vec2(.5f, 1.f) },
     374                    { vec2(.5f, .5f), vec2(1.f, 1.f) }
     375                };
     376                BL = data[face][0]; //[tcbt]
     377                TR = data[face][1]; //[tcbt]
     378            }
     379            else if (mt == MeshType::Sphere)
     380                mt = mt;
     381            else if (mt == MeshType::Capsule)
     382                mt = mt;
     383            else if (mt == MeshType::Torus)
     384                mt = mt;
     385            else if (mt == MeshType::Cylinder)
     386                mt = mt;
     387            else if (mt == MeshType::Disc)
     388                mt = mt;
     389            else if (mt == MeshType::Star)
     390                mt = mt;
     391            else if (mt == MeshType::ExpandedStar)
     392                mt = mt;
     393            else if (mt == MeshType::Cog)
     394                mt = mt;
     395        }
     396
     397        vec2 res = vec2(.0f);
     398        if (tcp == TexCoordPos::BL)
     399            res = BL;
     400        else if (tcp == TexCoordPos::BR)
     401            res = vec2(TR.x, BL.y);
     402        else if (tcp == TexCoordPos::TL)
     403            res = vec2(BL.x, TR.y);
     404        else if (tcp == TexCoordPos::TR)
     405            res = TR;
     406
     407        return res * m_texcoord_scale + m_texcoord_offset2;
     408    }
     409
     410    inline bool IsEnabled(MeshBuildOperation mbo) { return (m_build_flags & mbo) != 0; }
     411    inline void Enable(MeshBuildOperation mbo) { m_build_flags |= mbo; }
     412    inline void Disable(MeshBuildOperation mbo) { m_build_flags &= ~mbo; }
     413    inline void Toggle(MeshBuildOperation mbo) { m_build_flags ^= mbo; }
     414    inline void Set(MeshBuildOperation mbo, bool value) { if (value) Enable(mbo); else Disable(mbo); }
     415
     416public:
     417    vec4                m_color;
     418    vec4                m_color2;
     419    vec2                m_texcoord_offset;
     420    vec2                m_texcoord_offset2;
     421    vec2                m_texcoord_scale;
     422    vec2                m_texcoord_scale2;
     423    int                 m_texcoord_build_type[MeshType::Max];
     424    Array<vec2, vec2>   m_texcoord_custom_build[MeshType::Max];
     425    int                 m_texcoord_build_type2[MeshType::Max];
     426    Array<vec2, vec2>   m_texcoord_custom_build2[MeshType::Max];
     427    uint16_t            m_build_flags;
     428};
     429
    112430/* A safe enum for MeshCSG operations. */
    113431struct CSGUsage
     
    174492
    175493    inline Axis(Value v) : m_value(v) {}
    176     inline operator Value() { return m_value; }
    177 };
    178 
    179 struct MeshBuildOperation
    180 {
    181     enum Value
    182     {
    183         Scale_Winding   = 1 << 0,
    184 
    185         All     = 0xffffffff
    186     }
    187     m_value;
    188 
    189     inline MeshBuildOperation(Value v) : m_value(v) {}
    190     inline MeshBuildOperation(uint64_t i) : m_value((Value)i) {}
    191494    inline operator Value() { return m_value; }
    192495};
     
    256559    void SetVertColor(vec4 const &color);
    257560    void SetTexCoordData(vec2 const &new_offset, vec2 const &new_scale);
     561    void SetTexCoordData2(vec2 const &new_offset, vec2 const &new_scale);
    258562
    259563    void SetCurVertNormal(vec3 const &normal);
    260564    void SetCurVertColor(vec4 const &color);
    261565    void SetCurVertTexCoord(vec2 const &texcoord);
    262     void SetCurVertTexCoord(vec4 const &texcoord);
     566    void SetCurVertTexCoord2(vec2 const &texcoord);
    263567
    264568public:
     
    505809
    506810private:
    507     vec4 m_color, m_color2;
    508811    Array<uint16_t> m_indices;
    509812    Array<VertexData> m_vert;
     
    511814    //<vert count, indices count>
    512815    Array<int, int> m_cursors;
    513     //When this flag is up, negative scaling will not invert faces.
    514     bool m_ignore_winding_on_scale;
    515     //Texture coordinate modifiers.
    516     vec2 m_texcoord_offset;
    517     vec2 m_texcoord_scale;
    518816
    519817    friend class GpuEasyMeshData;
    520818    GpuEasyMeshData m_gpu_data;
    521 };
    522 
     819
     820public:
     821    inline EasyMeshBuildData* BD()
     822    {
     823        if (!m_build_data)
     824            m_build_data = new EasyMeshBuildData();
     825        return m_build_data;
     826    };
     827private:
     828    class EasyMeshBuildData* m_build_data;
     829};
    523830} /* namespace lol */
    524831
  • trunk/test/MeshViewer.cpp

    r2414 r2438  
    354354                m_meshes[i].m1.MeshConvert(Shader::Create(LOLFX_RESOURCE_NAME(shinyfur)));
    355355#else
    356                 m_meshes[i].m1.MeshConvert(m_texture_shader);
     356                //m_meshes[i].m1.MeshConvert(m_texture_shader);
    357357                //m_meshes[i].m1.MeshConvert();
     358                m_meshes[i].m1.MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
     359                                                                  (1 << VertexUsage::Color)    | (VertexUsage::TexCoord)),
     360                                                                  m_texture_shader, true));
    358361#endif
    359362                m_meshes[i].m2 = true;
  • trunk/test/MeshViewerBuffer.txt

    r2414 r2438  
    1 [sc#fff scb#fff ato 20 8 12 rx0]
    2 [sc#fff scb#fff acg 8 2 5 1 6 8 4 2 .1 1]
     1//[sc#fff scb#fff ato 20 8 12 rx0]
     2//[sc#fff scb#fff acg 8 2 5 1 6 8 4 2 .1 1]
    33
    4 //[sc#fff ab 4 4 4 smth 0 1 1 ]//twy 45 0 bdxy 90 0 splt 5 tz 2
     4[sc#fff ab 4 4 4 smth 0 1 1 ]//twy 45 0 bdxy 90 0 splt 5 tz 2
    55//[sc#88f ab 4 4 4 tx 4 ab 4 4 4 tx -2 tax .4 .4 0]
    66//[sc#88f ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .125 stx 10 0 0]
  • trunk/test/PhysicObject.h

    r2351 r2438  
    219219
    220220        m_physics->SetCollisionChannel(0, 0xFF);
    221         //m_physics->SetCollisionChannel(ColGroup, (1<<ColGroup)|(1));
     221        //m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1));
    222222        m_physics->SetMass(base_mass);
    223223        m_physics->SetTransform(base_location);
  • trunk/test/Physics/Include/EasyPhysics.h

    r2216 r2438  
    112112        if (CanChangeCollisionChannel())
    113113        {
    114             m_collision_group = (1<<NewGroup);
     114            m_collision_group = (1 << NewGroup);
    115115            m_collision_mask = NewMask;
    116116            return true;
Note: See TracChangeset for help on using the changeset viewer.